React Router 是 React 生态中最流行的客户端路由库,用于构建单页应用(SPA)中的导航和路由系统。它允许你在不刷新页面的情况下动态切换视图,保持 UI 与 URL 同步。以下是 React Router 的核心概念:
1. 核心包
react-router-dom:用于 Web 应用(基于react-router,增加了浏览器专用的 API)。react-router-native:用于 React Native 应用。
2. 核心组件
<BrowserRouter> 或 <HashRouter>
- 作用:为应用提供路由上下文(包裹整个应用)。
BrowserRouter:使用 HTML5 History API(pushState/popState),URL 如/home。HashRouter:使用 URL 的 hash 部分(#),兼容旧浏览器,URL 如/#/home。
<Routes> 和 <Route>
<Routes>:包裹一组<Route>,负责匹配当前 URL 并渲染对应的组件。<Route>:定义路径和组件的映射关系。<Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />} /> </Routes>
<Link> 和 <NavLink>
<Link>:导航链接,取代<a>标签,避免页面刷新。<Link to="/about">About</Link><NavLink>:特殊的<Link>,可添加激活状态的样式(如高亮)。<NavLink to="/about" style={({ isActive }) => ({ color: isActive ? 'red' : 'blue' })}> About </NavLink>
<Outlet>
- 作用:在嵌套路由中渲染子路由的组件(类似插槽)。
function Dashboard() { return ( <div> <h1>Dashboard</h1> <Outlet /> {/* 子路由的组件会渲染在这里 */} </div> ); }
<Navigate>
- 作用:重定向到其他路径。
<Route path="/old" element={<Navigate to="/new" />} />
3. 动态路由与参数
URL 参数
- 通过
:param定义动态路径,用useParams()获取参数:<Route path="/users/:id" element={<UserProfile />} /> // 在组件中获取参数 function UserProfile() { const { id } = useParams(); return <div>User ID: {id}</div>; }
查询参数(Search Params)
- 使用
useSearchParams()获取和修改 URL 查询字符串(如?name=John):function Search() { const [searchParams, setSearchParams] = useSearchParams(); const keyword = searchParams.get("keyword"); return <input defaultValue={keyword} />; }
4. 嵌套路由
- 通过父路由的
<Outlet>渲染子路由:<Route path="/dashboard" element={<Dashboard />}> <Route path="stats" element={<Stats />} /> // 匹配 /dashboard/stats <Route path="settings" element={<Settings />} /> </Route>
5. 编程式导航
- 使用
useNavigate()钩子实现 JS 跳转:function Login() { const navigate = useNavigate(); const handleLogin = () => { navigate("/dashboard", { replace: true, state: { user: "Alice" } }); }; return <button onClick={handleLogin}>Login</button>; }replace: true替换历史记录(不留下后退记录)。state传递隐式数据(可通过useLocation()读取)。
6. 其他 API
useLocation():获取当前 URL 信息(路径、hash、state 等)。useRouteError()(v6.4+):捕获路由错误(配合errorElement使用)。
7. 数据路由(v6.4+)
React Router 6.4 引入了基于数据加载的 API(类似 Remix 风格):
createBrowserRouter+routerProvider:通过配置对象定义路由和加载器。loader/action:在路由渲染前异步加载数据或处理表单提交。
const router = createBrowserRouter([
{
path: "/",
element: <Root />,
loader: () => fetch("/api/data"), // 异步加载数据
children: [
{ path: "team", element: <Team /> },
],
},
]);
// 在根组件中使用 <RouterProvider router={router} />
总结
React Router 的核心是声明式路由和动态匹配,通过组件化方式管理导航和状态。V6 版本简化了 API,并强化了嵌套路由和数据加载能力,适合构建现代 SPA 应用。