React 路由

news2024/9/23 5:27:35

React 的路由跳转需要引用第三方的 React Router

npm i react-router-dom@5.2.0

React Router 分为 BrowserRouter 和 HashRouter

如果我们的应用有服务器响应 web 的请求,建议使用<BrowserRouter>组件; 如果使用静态文件服务器,建议使用<HashRouter>组件

 在 React router 中通常使用的组件有三种(这里使用的是Router5):

  • 路由组件(作为根组件): BrowserRouter(history模式) 和 HashRouter(hash模式)
  • 路径匹配组件: Route 和 Switch
  • 导航组件: Link 和 NavLink

BrowserRouter 和 HashRouter 的使用

  • BrowserRouter 和 HashRouter 包裹的路由组件会自动传入match、history、location。
  • BrowserRouter 的路径:localhost:3000/demo/a
  • HashRouter 的路径:localhost:3000/#/demo/a
  • BrowserRouter 刷新没有任何影响,因为 state 保存在 history 对象中。
  • HashRouter 刷新后会导致路由state参数的丢失!!!
  • BrowserRouter 可以传递任意参数,HashRouter 需要手动拼接 URL
//BrowserRouter
class App extends Component {
  render() {
    return (
      <BrowserRouter>
          <Header />
          <Route path='/' exact component={Home}></Route>
          <Route path='/login' exact component={Login}></Route>
          <Route path='/detail/:id' exact component={Detail}></Route>
      </BrowserRouter>
    )
  }
}

//HashRouter
class App extends Component {
  render() {
    return (
      <HashRouter>
          <Header />
          <Route path='/' exact component={Home}></Route>
          <Route path='/login' exact component={Login}></Route>
          <Route path='/detail/:id' exact component={Detail}></Route>
      </HashRouter>
    )
  }
}

Route: 用来控制路径对应显示的组件

  • path:指定路由跳转路径
  • exact:精确匹配路由
  • component:路由对应的组件
  • render:通过写render函数返回具体的dom
  • location: 将 与当前历史记录位置以外的位置相匹配,则此功能在路由过渡动效中非常有用
  • sensitive:是否区分路由大小写
  • strict: 是否配置路由后面的 '/'
<Route path='/about' exact render={() => <About /> }></Route>

Switch:只是匹配到第一个路由后,就不再继续匹配

<Switch> 
    <Route path='/home'  component={Home}></Route>
    <Route path='/login'  component={Login}></Route> 
    <Route path='/detail' exact  component={detail}></Route> 
    <Route path='/detail/:id'  component={detailId}></Route> 
    <Redirect to="/home" from='/' /> //重定向
</Switch>

【注意】:如果路由 Route 外部包裹 Switch 时,路由匹配到对应的组件后,就不会继续渲染其他组件了。但是如果外部不包裹 Switch 时,所有路由组件会先渲染一遍,然后选择到匹配的路由进行显示。

Link 和 NavLink:它们都可以用来指定路由跳转,NavLink 的可选参数更多。

  • pathname: 表示要链接到的路径的字符串。
  • search: 表示查询参数的字符串形式。
  • hash: 放入网址的 hash,例如 #a-hash。
  • state: 状态持续到 location。通常用于隐式传参(埋点),可以用来统计页面来源
通过字符串执行跳转路由:
<Link to='/login'>
    <span>登录</span>
</Link>

通过对象指定跳转路由:
<Link to={{
        pathname: '/login',
        search: '?name=cedric',
        hash: '#someHash',
        state: { fromWechat: true }
    }}>
    <span>登录</span>
</Link>

NavLink跳转:

可以看做 一个特殊版本的 Link,当它与当前 URL 匹配时,为其渲染元素添加样式属性。

  • exact: 如果为 true,则仅在位置完全匹配时才应用 active 的类/样式。
  • strict: 当为 true,要考虑位置是否匹配当前的URL时,pathname 尾部的斜线要考虑在内。
  • location 接收一个location对象,当url满足这个对象的条件才会跳转
  • isActive: 接收一个回调函数,只有当 active 状态变化时才能触发,如果返回false则跳转失败
<NavLink
  to="/login"
  activeStyle={{
    fontWeight: 'bold',
    color: 'red'
  }}
>
    <span>登录</span>
</NavLink>

或

const oddEvent = (match, location) => {
  if (!match) {
    return false
  }
  const eventID = parseInt(match.params.eventID)
  return !isNaN(eventID) && eventID % 2 === 1
}

<NavLink
  to="/login"
  isActive={oddEvent}
>login</NavLink>

 withRouter

withRouter 是一个高阶组件,可以将一个非路由组件包裹返回一个新的路由组件,使这个非路由组件也能访问到当前路由的 match、location、history 对象,同时还拥有非路由组件的特点。

import { Typography } from "antd";
// 高阶组件  把两个组件的优点合二为一 类似于手机和手机壳关系 
import { withRouter } from "react-router-dom/cjs/react-router-dom";

const Proimg11 = (props) => {
    return (
        <div onClick={() => props.history.push(`detail/${props.id}`)}>
            {
                props.size == 'large' ? (
                    <img src={props.imageSrc} height={285} width={490} alt="" />
                ) : (
                    <img src={props.imageSrc} height={120} width={240} alt="" />
                )
            }
            <div>
                <Typography.Text type="secondary">
                    {props.title.slice(0, 25)}
                </Typography.Text>
                <Typography.Text type="danger" strong>
                    ¥{props.price}起
                </Typography.Text>
            </div>
        </div>
    )
}

// 为什么 必须包裹withRouter才能生效 
export const Proimg = withRouter(Proimg11)
// withRouter  + Proimg11 两者优点合二为一 变成 Proimg 组件
// 将 withRouter 的逻辑和 Proimg11 的UI组合

路由的三种传参:params、search、state

params:

路由链接(携带参数):<Link to='/demo/test/tom/18'}>详情</Link>

注册路由(声明接收):<Route path="/demo/test/:name/:age" component={Test}/>

接收参数:this.props.match.params

search:

路由链接(携带参数):<Link to='/demo/test?name=tom&age=18'}>详情</Link>

注册路由(无需声明,正常注册即可):<Route path="/demo/test" component={Test}/>

接收参数:this.props.location.search
// 接收search参数
import qs from 'querystring'
const {search} = this.props.location
const {id, title} = qs.parse(search.slice(1))

//备注:获取到的search是urlencoded编码字符串,需要借助querystring解析

let obj = {name: 'tom', age: 18}
console.log(qs.stringify((obj)));// name=tom&age=18  key=value&key=value (urlencoded)

let str = 'cartName=奔驰&price=199'
console.log(qs.parse(str));// {cartName: "奔驰", price: "199"}

state:

路由链接(携带参数):
<Link to={{pathname:'/demo/test',state:{name:'tom',age:18}}}>详情</Link>

注册路由(无需声明,正常注册即可):
<Route path="/demo/test" component={Test}/>

接收参数:this.props.location.state
//备注:刷新也可以保留住参数(hash路由刷新参数会丢失)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/510885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[golang gin框架] 29.Gin 商城项目-用户登录,注册操作

一.用户登录,注册界面展示说明 先看登录,注册界面以及相关流程,再根据流程写代码,一般网站的登录,注册功能都会在一个页面进行操作,还有的是在几个页面进行操作,这里讲解在几个页面进行注册的操作,步骤如下: 登录: 1.点击 登录按钮,进入登录界面 2.在登录界面输入手机号,密码,图…

Linux内核中与“文件系统”相关的数据结构

文件系统相关的数据结构 4.1 file结构体 文件结构体代表一个打开的文件&#xff0c;系统中的每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建&#xff0c;并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后&#xff0c;内核释放这…

【Flink】DataStream API使用之源算子(Source)

源算子 创建环境之后&#xff0c;就可以构建数据的业务处理逻辑了&#xff0c;Flink可以从各种来源获取数据&#xff0c;然后构建DataStream进项转换。一般将数据的输入来源称为数据源&#xff08;data source&#xff09;&#xff0c;而读取数据的算子就叫做源算子&#xff08…

【vue3】06-vue的组件化开发-脚手架创建项目

文章目录 Vue的组件化组件化开发注册组件的方式vue全局组件vue局部组件 Vue的开发模式Vue CLI脚手架安装Vue CLI使用Vue CLI Vue的组件化 Vue是一款前端框架&#xff0c;在这个框架中&#xff0c;组件化开发是非常重要的。Vue的组件化就是将一个页面划分为多个独立的、可复用的…

LeetCode5. 最长回文子串

写在前面&#xff1a; 题目链接&#xff1a;LeetCode5. 最长回文子串 编程语言&#xff1a;C 题目难度&#xff1a;中等 一、题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例…

算力256TOPS,典型功耗35W,存算一体芯片杀入智能驾驶

作者 | 张祥威 编辑 | 德新 国产智驾芯片有了新玩家 “最高物理算力256 TOPS&#xff0c;典型功耗35W&#xff0c;基于12nm制程工艺。” 5月10日&#xff0c;后摩智能发布首款基于存算一体架构的智驾芯片——鸿途™H30&#xff0c;并公布上述关键指标。 算力、数据和算法&am…

单例模式的饿汉和懒汉写法(基于C++)

目录 单例模式例程饿汉懒汉 对比函数调用线程安全总结 单例模式 单例模式确保一个类只有一个实例&#xff0c;并提供全局访问点。这样可以避免在系统中出现多个相同的对象&#xff0c;从而提高系统的性能和可维护性。 单例模式的实现包括饿汉和懒汉&#xff0c;下面介绍C中这两…

操作系统基础知识之处理器性能方程指标(包含阿达姆定律、CPI、Clock cycle time等)

计算机设计人员通过持续时间或速率来指代时钟周期的时间。程序的 CPU 时间可以用两种方式表示&#xff1a; CPU 时间程序的 CPU 时钟周期 / 时钟频率 除了执行程序所需的时钟周期数外&#xff0c;我们还可以计算执行的指令数。 如果我们知道时钟周期数和指令数&#xff0c;就…

金融学第二版笔记第一章1.1

第1部分 金融和金融体系 第一章金融学 1.1 一、 对金融学进行界定 1.金融 金融是货币流通、信用活动及与之相关的经济行为的总称。 简言之&#xff0c;就是货币资金的融通。一般是指以银行、证券市场等为中心的货币流通和信用调节活动&#xff0c;包括货币的发行和流通、存…

转置卷积(一) 搞懂转置卷积的计算

搞懂转置卷积的计算 0、参考文档1、转置卷积是什么&#xff1f;1.1 定义1.2 需要注意 2、转置卷积的计算2.1 从最简单的开始2.2 考虑stride2.3 考虑padding2.4 考虑dilation 3 转置卷积的加速 文章首发于https://zhaodongyu-ak47.github.io/Transposed_Convolution/ 最近做了一…

数据结构入门-二叉树

树的概念及结构 树的概念 树的一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限节点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树&#xff0c;也就是说它树根朝上&#xff0c;而叶子朝下。 有一个特殊的节点&#xff…

Web安全行业:零基础学习网络安全需要掌握哪些知识?(附系统路线+工具笔记)

前言 “没有网络安全就没有国家安全”。当前&#xff0c;网络安全已被提升到国家战略的高度&#xff0c;成为影响国家安全、社会稳定至关重要的因素之一。 一、网络安全行业特点 行业发展空间大&#xff0c;岗位非常多 网络安全行业产业以来&#xff0c;随即新增加了几十个…

单元测试 - 集成H2 Dao测测试

SpringBoot 2.7、Mybatis plus、H2 1. pom引入h2 <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>2.1.214</version> </dependency> 2. 配置h2数据源 & mapper路径 spring:datas…

地狱级的字节跳动面试,6年测开的我被按在地上摩擦.....

前几天我朋友跟我吐苦水&#xff0c;这波面试又把他打击到了&#xff0c;做了快6年软件测试员。。。为了进大厂&#xff0c;也花了很多时间和精力在面试准备上&#xff0c;也刷了很多题。但题刷多了之后有点怀疑人生&#xff0c;不知道刷的这些题在之后的工作中能不能用到&…

( 位运算 ) 260. 只出现一次的数字 III ——【Leetcode每日一题】

❓260. 只出现一次的数字 III 难度&#xff1a;中等 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额…

精炼计算机网络——数据链路层(一)

文章目录 前言3.1 数据链路和帧3.1.1 数据链路和帧3.1.2 三个基本问题 总结 前言 上篇文章&#xff0c;我们一同学完了物理层的全部内容&#xff0c;在本篇文章中&#xff0c;我们初步学习数据链路层&#xff0c;理解数据链路和帧的相应概念&#xff0c;知晓封装成帧&#xff…

信号完整性分析基础知识之传输线和反射(五):较短阻抗不连续的传输线、残桩和末端容性负载引起的反射

首先来一首定场诗&#xff1a;难难难&#xff0c;道德玄&#xff0c;不对知音不可谈。对了知音谈几句&#xff0c;不对知音枉费舌尖。 较短不连续点引起的反射 很多时候&#xff0c;板载走线的宽度必须要收窄&#xff0c;特别是经过PF区域或者拥挤区域。如果传输线的某一小段…

eSIM证书要求-证书验证-EID

SM-DP 和 SM-DS 应该验证 EUM 和 eUICC 证书中限制的 IIN 和 EID 的一致性&#xff08;参见第 4.5.2.1.0.2 和 4.5.2.1.0.3 节&#xff09;&#xff0c;并考虑 SGP.29 [ 89]。 根据 SGP.29 [89] 颁发的 EID 没有 SGP.02 [2] 中定义的 8 位 IIN。 相反&#xff0c;它们具有可变长…

【计算机视觉 | Python】十个 Python 图像处理工具,建议点赞收藏

文章目录 一、前言二、常见的库2.1 scikit-image2.2 NumPy2.3 SciPy2.4 PIL / Pillow2.5 OpenCV-Python2.6 SimpleCV2.7 Mahotas2.8 SimpleITK2.9 pgmagick2.10 Pycairo 一、前言 这些 Python 库提供了一种简单直观的方法来转换图像并理解底层数据。 今天的世界充满了数据&am…

linux【网络编程】之UDP网络程序模拟实现

linux【网络编程】之UDP网络程序模拟实现 一、开发环境二、服务端实现2.1 接口认识2.1.1 socket创建网络通信套接字2.1.2 bind&#xff1a;绑定Ip和端口号2.1.3 sockaddr_in结构体2.1.4 IP地址转换函数&#xff1a;inet_addr、inet_ntoa2.1.5 recvfrom&#xff1a;读取数据 2.2…