React Router
关于 React Router 相关知识点总结, 持续更新中……
基础概念
React Router 是 React 应用程序的标准路由库,最新版本带来了许多现代化的路由特性。
主要组件
BrowserRouter
: 使用 HTML5 history API 的路由器Routes
: 路由匹配容器Route
: 路由规则定义Link
: 导航链接NavLink
: 带有激活状态的导航链接Navigate
: 编程式导航组件Outlet
: 子路由渲染位置
基本用法
1. 路由配置
import { BrowserRouter, Routes, Route } from 'react-router-dom';
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/users/:id" element={<UserProfile />} />
<Route path="*" element={<NotFound />} />
</Routes>
</BrowserRouter>
);
}
2. 导航链接
import { Link, NavLink } from 'react-router-dom';
function Navigation() {
return (
<nav>
<Link to="/">首页</Link>
<NavLink
to="/about"
className={({ isActive }) => isActive ? 'active' : ''}
>
关于
</NavLink>
</nav>
);
}
3. 嵌套路由
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<Home />} />
<Route path="dashboard" element={<Dashboard />}>
<Route path="profile" element={<Profile />} />
<Route path="settings" element={<Settings />} />
</Route>
</Route>
</Routes>
</BrowserRouter>
);
}
function Layout() {
return (
<div>
<nav>{/* 导航栏 */}</nav>
<Outlet /> {/* 子路由渲染位置 */}
</div>
);
}
高级特性
1. 路由守卫
function PrivateRoute({ children }) {
const auth = useAuth(); // 自定义 hook 检查认证状态
if (!auth.isAuthenticated) {
return <Navigate to="/login" replace />;
}
return children;
}
// 使用方式
<Route
path="/dashboard"
element={
<PrivateRoute>
<Dashboard />
</PrivateRoute>
}
/>
2. 路由数据加载
import { useLoaderData, defer, Await } from 'react-router-dom';
// 定义数据加载器
export async function loader({ params }) {
const user = await fetchUser(params.id);
const posts = fetchUserPosts(params.id); // 不等待完成
return defer({
user,
posts
});
}
// 组件中使用
function UserProfile() {
const { user, posts } = useLoaderData();
return (
<div>
<h1>{user.name}</h1>
<Suspense fallback={<Loading />}>
<Await resolve={posts}>
{(posts) => (
<ul>
{posts.map(post => (
<li key={post.id}>{post.title}</li>
))}
</ul>
)}
</Await>
</Suspense>
</div>
);
}
3. 路由操作(Actions)
// 定义操作
export async function action({ request }) {
const formData = await request.formData();
const updates = Object.fromEntries(formData);
await updateUser(updates);
return redirect('/dashboard');
}
// 组件中使用
function UpdateProfile() {
const { state } = useNavigation();
return (
<Form method="post">
<input name="name" type="text" />
<button type="submit" disabled={state === 'submitting'}>
{state === 'submitting' ? '更新中...' : '更新'}
</button>
</Form>
);
}
4. URL 参数和查询字符串
import { useParams, useSearchParams } from 'react-router-dom';
function ProductPage() {
const { id } = useParams();
const [searchParams, setSearchParams] = useSearchParams();
const sort = searchParams.get('sort');
return (
<div>
<h1>产品 {id}</h1>
<select
value={sort || 'name'}
onChange={e => setSearchParams({ sort: e.target.value })}
>
<option value="name">按名称排序</option>
<option value="price">按价格排序</option>
</select>
</div>
);
}