以下是两个版本之间的区别:
一、首先是注册路由的时候v5的Switch改为了Routes
v5,代码如下:
import {Route, Switch} from 'react-router-dom' //引入react-router
<div>
{/* 注册路由(编写路由链接) */}
<Switch>
......
......
</Switch>
</div>
v6,代码如下:
import {Route, Routes } from 'react-router-dom' //引入react-router
<div>
{/* 注册路由(编写路由链接) */}
<Routes >
......
......
</Routes>
</div>
二、v6不再支持用Route标签包裹子组件,可以直接使用element属性 也不需要
v5,代码如下:
import {Route, Switch} from 'react-router-dom' //引入react-router
<div>
{/* 注册路由(编写路由链接) */}
<Switch>
<Route path="/about">
<About />
</Route>
</Switch>
</div>
v6,代码如下:
import {Route, Routes } from 'react-router-dom' //引入react-router
<div>
{/* 注册路由(编写路由链接) */}
<Routes >
<Route path="/about" element={<About />} />
</Routes>
</div>
如果v5不用包裹子组件的形式写的话他的属性是component,下面代码有体现到。
三、v6中也不需要exact属性
exact在v5中起到的作用是精准匹配的作用,如果不写的话,
那么
path='/'
也会匹配
'/about'
和
'/home'
导致的结果就是下面两个路由就没用了
在v6中由于v6 内部算法改变,它默认就是匹配完整路径。
v5,代码如下:
import {Route, Switch} from 'react-router-dom' //引入react-router
<div>
{/* 注册路由(编写路由链接) */}
<Switch>
<Route exact path="/" component={ Home } >
</Route>
</Switch>
</div>
v6,代码如下:
import {Route, Routes } from 'react-router-dom' //引入react-router
<div>
{/* 注册路由(编写路由链接) */}
<Routes >
<Route path="/" element={<Home />} />
</Routes>
</div>
四、v6 中,Route 先后顺序不再重要,它能够自动找出最优匹配路径
五、在v6中移除了NavLink中的actionclassName的这个属性
actionclassName这个属性是点击对应元素改变为对应的样式
在v6中可以使用三元运算符的方式实现这个功能
<NavLink className={navData=>navData.isActive?class.active : ""}
六、在v6中将Redirect改为Navigate
它当匹配不到路由时,需要使用Redirect做重定向,跳转到我们定义的组件(页面)中
v5,代码如下
在页面中直接写入重定向的路径
<Redirect to="/home/" />
v6,代码如下:
<Route path="/" element ={<Navigate replace to="/home" />} />
七、v6 嵌套路由改为相对匹配,不再像 v5 那样必须提供完整路径。
八、新增Outelt组件
此组件是一个占位符,告诉 React Router 嵌套的内容应该放到哪里。
<Link to="/home2">子路由</Link>
<Outlet></Outlet>
九、v6 用useNavigate实现编程式导航,不再使用useHistory
代码如下:
import {useNavigate} from "react-router-dom";
const navigate = useNavigate();
navigate("/home");
是除此之外,还可以使用navigate
(-1)
后退到前一页,使用navigate
-2)
后退到前一页的前一页, navigate
(1)
前向导航,依此类推
十、v6 目前没有prompt组件阻止不期望的导航。
如果在 v6 中要实现相应的功能,必须自己想办法,这可能是目前 v5 唯一的优势。