https://codesandbox.io/s/misty-haze-eq546?file=/example.js
react-router-dom
react-router-dom文档地址: https://reactrouter.com/web/guides/quick-start/
1.安装
react-router提供多个包可以单独使用
| package | description | 
|---|---|
| react-router | 路由核心功能 | 
| react-router-dom | 基于react-router提供在浏览器运行环境下功能 | 
| react-router-native | for React Native | 
| react-router-config | static route congif helpers | 
在浏览器中运行只需要安装react-router-dom,reac-router-dom依赖react-router会自动安装依赖,所以不需要再手动安装react-router
1  | npm install react-router-dom -S  | 
2.路由组件
react-router包含三种类型的组件:路由组件、路由匹配组件 、导航组件。在你使用这些组件的时候,都必须先从react-router-dom引入。
1  | import {  | 
2.1路由组件
react-router提供了两种路由组件: BrowserRouter, HashRouter 其中 BrowserRouter 是基于HTML5 history API (pushState, replaceState, popstate)事件
当然与之对应的还有 HashRouter 是基于 window.location.hash 。
2.2 路由匹配组件
路由匹配组件有两种: Route 和 Switch, Switch 把多个路由组合在一起。
对于一个 <Route> 组件,可以设置三种属性:component、render、children来渲染出对应的内容。
当组件已存在时,一般使用component属性当需要传递参数变量给组件时,需要使用render属性
2.3 导航组件
有三种常用的导航组件,分别是:<Link>、<NavLink>、<Redirect>。<NavLink>是一种特殊的Link组件,匹配路径时,渲染的a标签带有active。
3. 使用
在需要使用router的地方引入react-router-dom
3.1 基本使用
以下是路由的基本使用例子
1  | import React from 'react';  | 
当然此处路由也可以有其他写法,比如
1  | <Switch>  | 
其中的exact表示的是精确匹配,比如上面
1  | <Route exact path="/" component={Home}></Route>  | 
如果没有写精确匹配的化,那么后面的所有路径都可以匹配到首页,解决方式就是增加exact或者将此路由放置最后面。
3.2 Route动态传参
在一个路由匹配组件上设置参数,比如说上面的Person组件
1  | <Route path="/person/:id" component={Person}></Route>  | 
设置是以:开始然后紧跟key值,然后我们在Person组件中就可以通过获取props获取这个参数值
1  | import React from 'react';  | 
以上为传统class组件的写法,现在可以使用hooks,可以使用useParams,代码如下:
1  | import React from 'react';  | 
3.3 嵌套路由
在About页面有一个嵌套路由代码示例:
1  | import React from 'react';  | 
此处如果换成Function的话可以直接使用另一个钩子函数useRouteMatch,获取当前匹配的路径和路由
1  | import { useRouteMatch } from 'react-router-dom'  | 
3.4 路由重定向
Redirect路由重定向,使路由重定向到某个页面,比如我们经常会做的没有登录重定向到登录页面
1  | <Route exact path="/">  | 
3.5 滚动还原
大部分情况下,我们需要的是每次导航到某个新页面的的时候,滚动条都是在顶部,这种比较好实现
hooks版本
1  | 
  | 
class版本
1  | 
  | 
我们需要把ScrollToTop组件放在Router里面eg:
1  | function App() {  | 
而对于某些情况下比如一些tab我们希望切换回我们浏览过的tab页时我们希望滚动条滚动到我们之前浏览的位置,此处自行去实现。
3.6 路由守卫
有时候我们在某个表单页面填好了表单,然后点击跳转到另外一个页面。
这时候我们就需要提醒用户有未提交的表单。当然这一步其实也是在实际的业务代码中实现。
1  | import React, { useState } from "react";  | 
3.7代码分割
有时候为了避免文件过大加快加载速度,我们需要将代码分割,将某些路由对应的组件只有在点击的时候再加载js,就是组件的懒加载。
我们使用webpack, @babel/plugin-syntax-dynamic-import,loadable-components实现代码分割。
- 1.首先在.babelrc文件中增加配置
 
1  | {  | 
- 2.在我们需要懒加载的组件使用loadabel
 
1  | import React from 'react';  | 
其中BlockForm为懒加载得组件loadable参考文档地址 跳转
3.8 withRouter
您可以通过withRouter高阶组件访问history属性和匹配的Route,
withRouter will pass updated match, location, and history props to the wrapped component whenever it renders.
3.9 其他hooks
之前使用了useParams和useRouteMatch两个hook,还有另外两个hookuseHistory和useLocationuseHistory
可以访问到history实例,我们可以通过这个实例访问某个路由useLocation
返回location对象