React-Router
注意
- 本篇内容都是基于 v6 版本,参考时请以最新官方文档为准!
- 2024-11-22 更新为 v7,v6 的最后一个版本是 6.28.0
深入问题:
- 如何实现一个自定义的 Link 组件?
- Code Splitting 与路由的关系?
备注
React Router v6.4 引入了数据 API(如 loader、action 和 useFetcher 等),目的是提升路由在数据获取方面的能力。不过,我觉得它有些多余,将数据加载集成到路由中,这样提高了复杂度、缺少灵活性、不符合我的代码组织习惯,路由承担页面跳转的功能即可,数据加载和状态交给更专业的工具去管理更好。
如何组织路由
按页面模块拆分路由配置,每个模块对应一个路由文件,最后在主路由文件中集中导入。
有两种方式:
- Router Components
- 数据路由器对象的形式
使用 BrowserRouter
<Outlet />
嵌套路由,用来渲染子路由- 在
<Route index />
上添加一个 index 路由,作为默认子路由
import { BrowserRouter, Routes, Route, Outlet } from 'react-router-dom';
const Layout = () => (
<div>
<header>Header</header>
<Outlet />
<footer>Footer</footer>
</div>
);
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<Home />} />
<Route path="about" element={<About />} />
<Route path="contact" element={<Contact />} />
</Route>
</Routes>
</BrowserRouter>
);
}
export default App;
使用 createBrowserRouter
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
const router = createBrowserRouter([
{
path: '/',
element: <Layout />,
children: [
{ index: true, element: <Home /> },
{ path: 'about', element: <About /> }
]
},
{ path: '*', element: <NoMatch /> }
]);
export default function App() {
return <RouterProvider router={router} />;
}