目前react-router最新的版本为v6.16.0(2023年9月),下面几个重要版本的发布节点,最重要的是v6.4.0:
- 2021年11月发布的v6.0.0版本,基于hooks重构,体积更小。
- 2022年9月发布的v6.4.0版本,引入createBrowserRouter/createHashRouter、 等DataAPI。
- 2023年3月发布的v6.9.0版本,引入Component、lazy等。
一、基本使用
1、安装依赖
npm i react-router-dom
2、创建路由及引入组件
import { BrowserRouter, Routes, Route } from "react-router-dom";
import { lazy, Suspense } from "react";
const Login = lazy(() => import("@/views/login"));
const Home = lazy(() => import("@/views/home"));
function App() {
return (
<BrowserRouter>
<Suspense>
<Routes>
<Route path="/login" element={<Login />} />
<Route path="/home" element={<Home />} />
</Routes>
</Suspense>
</BrowserRouter>
);
}
path:路径
element:要渲染的组件
Suspense、lazy:路由懒加载
注意:BrowserRouter组件最好放在最顶层所有组件之外,这样能确保内部组件使用 Link 做路由跳转时不出错
二、路由跳转
1、Link组件
import { Link } from "react-router-dom";
<Link to="foo">to foo</Link>;
2、NavLink 组件
import { NavLink } from "react-router-dom";
function Foo() {
return (
<NavLink style={({ isActive }) => ({ color: isActive ? "red" : "#fff" })}>
Click here
</NavLink>
);
}
3、编程式跳转
import { useNavigate } from 'react-router-dom';
function Foo(){
const navigate = useNavigate();
return (
// 上一个路径:/a;当前路径:/a/a1
<div onClick={() => navigate('/b')}>跳转到/b</div>
<div onClick={() => navigate('a11')}>跳转到/a/a1/a11</div>
<div onClick={() => navigate('../a2')}>跳转到/a/a2</div>
<div onClick={() => navigate(-1)}>跳转到/a</div>
)
}
使用useNavigate钩子函数生成navigate函数,可以通过 JS 代码完成路由跳转。
三、动态路由传参
// 路由配置
function App() {
return (
<BrowserRouter>
<Routes>
<Route path={'/'} element={<Login/>} />
<Route path={'/home/:id'} element={<Home/>} />
</Routes>
</BrowserRouter>
)
}
1、子路由携带
// 原页面传参
const navigate = useNavigate()
const goHome = () => {
navigate("/home/123")
}
// 目标页面获取参数
const params = useParams()
const back = () => {
console.log(params.id) //打印结果为 123
}
2、问号(?)形式传参
// 原页面传参
const navigate = useNavigate()
const goHome = () => {
navigate("/home?id=123")
}
// 目标页面获取参数
const [params] = useSearchParams()
const back = () => {
console.log(params.getAll('id')[0]) //打印结果为 123
}
3、通过state传参
// 原页面传参
const navigate = useNavigate()
const goHome = () => {
navigate("/home",{state:{id:123}})
}
// 目标页面获取参数
const location = useLocation()
const back = () => {
console.log(location.state.id) //打印结果为123
}