前言
BrowserRouter
是 React Router
库的核心组件,用于实现单页面应用(SPA)的客户端路由。它利用 HTML5 History API 管理 URL
,实现页面无刷新跳转
。下面详细解释其用途、使用方法和代码示例:
一、BrowserRouter
核心用途
- 无刷新页面导航:保持应用状态,只更新部分 UI
- URL 与组件同步:将 URL 路径映射到对应的 React 组件
- 支持浏览器导航:前进/后退按钮正常工作
- 嵌套路由:支持多层路由结构
二、BrowserRouter
安装依赖
npm install react-router-dom
三、BrowserRouter
基础使用示例
// 文件: src/index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';
// 页面组件
const Home = () => <h1>首页</h1>;
const About = () => <h1>关于我们</h1>;
const Contact = () => <h1>联系我们</h1>;
function App() {
return (
<Router>
{/* 导航菜单 */}
<nav>
<ul>
<li><Link to="/">首页</Link></li>
<li><Link to="/about">关于</Link></li>
<li><Link to="/contact">联系</Link></li>
</ul>
</nav>
{/* 路由配置 */}
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/contact" element={<Contact />} />
</Routes>
</Router>
);
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
四、BrowserRouter
关键特性详解
4.1、 嵌套路由
// 在 App.js 中
<Routes>
<Route path="/user" element={<UserLayout />}>
<Route index element={<Dashboard />} /> {/* /user */}
<Route path="profile" element={<Profile />} /> {/* /user/profile */}
<Route path="settings" element={<Settings />} /> {/* /user/settings */}
</Route>
</Routes>
// UserLayout.js 中需要添加 <Outlet> 作为子路由占位符
function UserLayout() {
return (
<div>
<h2>用户中心</h2>
<Outlet /> {/* 子路由将渲染在这里 */}
</div>
);
}
4.2、 动态路由参数
<Routes>
<Route path="/products/:id" element={<ProductDetail />} />
</Routes>
// 在 ProductDetail 组件中获取参数
import { useParams } from 'react-router-dom';
function ProductDetail() {
const { id } = useParams(); // 获取 URL 中的 id 参数
return <div>产品ID: {id}</div>;
}
4.3、 编程式导航
import { useNavigate } from 'react-router-dom';
function LoginButton() {
const navigate = useNavigate();
const handleLogin = () => {
// 执行登录逻辑...
navigate('/dashboard'); // 跳转到仪表盘
};
return <button onClick={handleLogin}>登录</button>;
}
4.4、 404 页面处理
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="*" element={<NotFound />} /> {/* 匹配所有未定义路径 */}
</Routes>
五、BrowserRouter
重要注意事项
5.1、服务器配置:
生产环境需配置服务器,确保所有路径返回 index.html
Nginx 示例:
nginx
location / {
try_files $uri $uri/ /index.html;
}
5.2、组件位置:
BrowserRouter 应包裹整个应用(通常放在入口文件)
5.3、路由匹配规则:
path="about" → 匹配 /about
path="about/*" → 匹配 /about 及所有子路由
index → 父路由的默认子路由
5.4、替代方案:
HashRouter:使用 URL hash 兼容旧浏览器(不需要服务器配置)
MemoryRouter:适用于非浏览器环境(如 React Native)