一、基本使用

实现一个简单的路由跳转,演示如下:

进入页面
image-20210228134455942

点击about
image-20210228134515127

点击home
image-20210228134533018

这里的about和home都是分别写一个组件
image-20210228134645822

路由的配置在app组件中实现

  1. 首先我们要明确导航区和展示区
  2. 如效果图的左侧就是导航区,右侧就是展示区
  3. 在app组件引入react-router-dom这个库,我们需要引入Link,Router组件
  4. 引入需要展示的组件Home,About
  5. 编写路由连接使用Link组件
    image-20210228135136605
  6. 展示区注册路由
    image-20210228135404251
  7. app组件最外侧包裹表示使用的路由规则是hash还是history(也需要引入该组件的,都在react-router-dom中)

    image-20210228135605301

二、NavLink的使用

默认NavLink是点击哪一个就给其加上一个类active,要设置其他类名就需要用到activeClassName这个属性
image-20210228135816867

三、Switch的使用

一般路由的path和component是一一对应的,但是如果有两个路由跳转相同的组件,例如:

image-20210228141504316

这时我们点击About就会发现匹配了两个路由组件

image-20210228141346902

当然我们只希望显示一个,那就需要使用到Switch,将该组件包裹到路由注册的最外侧那么路由就只会匹配第一个,之后的不会匹配

image-20210228141833823

这样同时也可提高路由匹配的效率---单一匹配

另外探讨两个问题:
多级路径刷新页面样式丢失问题,就是public中的index.html中的css样式丢失
解决方式:如果之前的样式引入是通过 ./ 引入的将其改成 / 或者 %PUBLIC_URL% 就可解决,或者不改路径,将路由规则改成hash即可

路由的匹配模式,路由默认是模糊匹配,path中写的路径,link中不能少可以多向后加内容也可以匹配,比如 link 中的 to="/home/s" 可以匹配 path="/home",如果希望严格匹配,就需要在router组件中加上exact这个属性,严格匹配不要随便开启,需要再开,有些时候开启会导致无法继续匹配二级路由
image-20210228142935665

四 、Redirect的使用

路由重定向在页面打开的时候就显示一个路由的内容,或者多级路由点击显示下一级路由的内容
一般写在所有路由注册的最下方,当所有路由都无法匹配时,跳转到Redirect指定的路由
image-20210228143405986

五、嵌套路由

注意注册子路由时要写上父路由的path值,路由的匹配是按照注册路由的顺序进行的

六、向路由组件传递参数

params参数

  1. 路由链接携带参数
    image-20210228151211982
  2. 注册路由接收参数
    image-20210228151237913
  3. 路由组件接收参数
    参数保存在props中 获取路径 this.props.match.params

search组件参数

  1. 路由链接携带参数
    image-20210228151537912
  2. 注册路由无需接收,正常注册即可
  3. 路由组件接收参数
    参数保存在props 获取路径 this.props.location.search
  4. 注意获取到的search是urlencoded编码字符串,需要借助querystring解析

state参数

  1. 路由链接携带参数
    image-20210228151858037
  2. 注册路由无需接收正常注册即可
  3. 路由组件接收参数
    参数保存在props中 获取路径 this.props.location.state
  4. 注意该方式刷新也可以保留住参数

七、编程式路由

首先介绍下路由跳转的push模式和replace模式 在link组件中添加属性即可
image-20210228152320565

页面是以栈的结构存储的,push就是将新的页面加入栈中成为栈顶,replace就是替换掉当前栈顶的页面

编程式路由导航

这里就是借助this.props,history对象中的api对操作路由跳转,前进,后退
image-20210228152804641

this.prosp.history.goBack() 返回上一页
this.prosp.history.goForward() 前进
this.prosp.history.go() 跳转几步,正数为向前,负数为返回

八、withRouter的使用

有时候一些非路由组件也希望使用路由组件的api来操纵页面跳转,这时候我们就需要使用withRouter这个方式,具体实现如下:

import React, { Component } from 'react'
import { withRouter } from 'react-router-dom'
class Header extends Component {
  goPage = () => {
    this.props.history.goForward();
  }
  backPage = () => {
    this.props.history.goBack();
  }
  render() {
    return (
      <div className="page-header"><h2>React Router Demo</h2><button onClick={this.goPage}>前进</button><button onClick={this.backPage}>返回</button></div>
    )
  }
}
export default withRouter(Header);//通过withRouter加工的一般组件就可以拥有路由组件的api了
//withRouter的返回值是一个新组件

九、BrowserRouter与HashRouter的区别

  1. 底层原理不一样
    BrowserRouter使用的是H5的history API,不兼容IE9及以下版本。
    HashRouter使用的是URL的哈希值。
  2. path表现形式不一样
    BrowserRouter的路径中没有#,例如:localhost:3000/demo/test
    HashRouter的路径包含#,例如:localhost:3000/#/demo/test
  3. 刷新后对路由state参数的影响
    BrowserRouter没有任何影响,因为state保存在history对象中。
    HashRouter刷新后会导致路由state参数的丢失!!!
  4. 备注:HashRouter可以用于解决一些路径错误相关的问题。
Last modification:February 28, 2021
如果觉得我的文章对你有用,请随意赞赏