前言
在 React Router v6.4+
中,RouterProvider
是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。
它替代了传统的 <BrowserRouter>
,支持更强大的数据加载和操作功能(如 loader 和 action)。
一、RouterProvider 主要用途:
- 提供路由上下文:将路由配置注入 React 应用
- 支持数据加载:在路由渲染前异步获取数据
- 处理表单提交:通过 action 函数处理数据变更
- 错误处理:统一管理路由级错误
- 简化路由配置:集中式路由管理
二、RouterProvider 使用说明 + 完整代码示例
2.1、 安装依赖
javascript
npm install react-router-dom@6
2.2、 基础使用
javascript
// src/main.jsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import {
createBrowserRouter,
RouterProvider,
Link,
Outlet
} from 'react-router-dom';
// 页面组件
function Home() {
return <h1>首页 <Link to="/about">关于我们</Link></h1>;
}
function About() {
return <h1>关于页 <Link to="/">返回首页</Link></h1>;
}
// 布局组件
function Layout() {
return (
<div>
<nav>
<Link to="/">首页</Link> |
<Link to="/about">关于</Link>
</nav>
<Outlet /> {/* 子路由渲染位置 */}
</div>
);
}
// 创建路由配置
const router = createBrowserRouter([
{
element: <Layout />, // 共享布局
children: [
{
path: "/",
element: <Home />,
},
{
path: "/about",
element: <About />,
}
]
}
]);
// 使用 RouterProvider 提供路由
ReactDOM.createRoot(document.getElementById('root')).render(
<React.StrictMode>
<RouterProvider router={router} />
</React.StrictMode>
);
2.3、 高级功能:数据加载(loader)
javascript
// 在路由配置中添加 loader
const router = createBrowserRouter([
{
path: "/user/:userId",
element: <UserProfile />,
// ✅ 在渲染前加载数据
loader: async ({ params }) => {
// 模拟 API 请求
const response = await fetch(`/api/users/${params.userId}`);
return response.json();
},
// ✅ 错误处理
errorElement: <ErrorPage />
}
]);
// UserProfile 组件
function UserProfile() {
// 获取 loader 返回的数据
const userData = useLoaderData();
return (
<div>
<h1>{userData.name}</h1>
<p>邮箱: {userData.email}</p>
</div>
);
}
// 错误页面组件
function ErrorPage() {
const error = useRouteError();
return <div>错误: {error.message}</div>;
}
2.4、表单操作(action)
javascript
// 路由配置
{
path: "/posts/new",
element: <NewPost />,
// ✅ 处理表单提交
action: async ({ request }) => {
const formData = await request.formData();
const post = {
title: formData.get('title'),
content: formData.get('content')
};
// 保存到数据库
await savePostToDB(post);
// 重定向到列表页
return redirect('/posts');
}
}
// 表单组件
function NewPost() {
return (
<Form method="post">
<input name="title" placeholder="标题" />
<textarea name="content" placeholder="内容" />
<button type="submit">发布</button>
</Form>
);
}
三、Router 关键 API 说明
createBrowserRouter
: 用于创建基于浏览器历史的路由实例
useLoaderData()
: 用于获取当前路由的 loader 返回的数据
useActionData()
: 用于获取 action 返回的数据(通常用于表单提交结果)
useRouteError()
: 用于获取路由错误信息
<Form>
: 特殊表单组件,阻止默认提交行为,使用路由的 action 处理
redirect()
: 用于在 loader/action
中返回重定向
四、RouterProvider 最佳实践
4.1、路由分层:
使用嵌套路由组织复杂界面
javascript
// 父路由
{
path: "/dashboard",
element: <DashboardLayout />,
children: [
{ index: true, element: <DashboardHome /> },
{ path: "settings", element: <Settings /> }
]
}
4.2、延迟加载:
配合 React.lazy
优化性能
javascript
{
path: "/admin",
element: <AdminLayout />,
loader: () => authGuard(), // 权限验证
children: [
{
path: "stats",
lazy: () => import("./AdminStats") // 动态导入
}
]
}
4.3、全局错误处理
javascript
const router = createBrowserRouter([
{
path: "/",
element: <Root />,
errorElement: <GlobalErrorBoundary />, // 顶层错误捕获
children: [/*...*/]
}
]);
五、RouterProvider 与传统路由对比

通过 RouterProvider
可以实现更声明式、更强大的路由管理,特别适合需要复杂数据加载和状态管理的应用场景。