React Router 7 是 React 生态系统中用于页面导航的核心库,其最新版本带来了显著的更新,特别是在功能和使用方式上。最重要的变化是引入了三种使用模式:声明式(Declarative)、数据(Data)和框架(Framework)。这些模式让开发者可以根据项目需求选择合适的路由功能,从简单的页面跳转到构建全栈 React 应用程序。此外,React Router 7 还改进了类型安全性、性能优化,并增强了对 React 18 和 19 的支持。本报告将详细介绍这些新功能,特别是声明式、数据和框架模式的定义及使用方法,力求简洁易懂,避免晦涩术语。
React Router 7 的更新不仅限于修复和优化,还引入了全新的使用方式和功能。以下是主要更新内容:
react-router
包,减少对 react-router-dom
的依赖。这些更新使 React Router 7 成为一个多功能的工具,既可以作为简单的路由库,也可以作为构建复杂应用的框架。
React Router 7 引入了三种模式,每种模式针对不同的开发需求,提供从基础到高级的功能。以下是对每种模式的详细解释,包括其用途和适用场景。
定义:声明式模式是 React Router 的传统使用方式,专注于基本的路由功能。开发者通过 React 组件定义路由,页面导航完全在客户端进行。
特点:
<BrowserRouter>
、<Routes>
和 <Route>
组件在 React 组件树中定义路由。适用场景:
使用方法:
<BrowserRouter>
。<Routes>
和 <Route>
定义页面路径和对应的组件。<Link>
或 useNavigate
实现页面跳转。示例场景:一个电商网站的主页、产品页面和关于页面之间的切换,只需定义路由映射,无需额外数据处理。
定义:数据模式在声明式模式的基础上增加了数据获取和修改功能。路由配置从 React 组件树移到外部,通过 createBrowserRouter
定义,并支持 loader 和 action 函数。
特点:
适用场景:
使用方法:
createBrowserRouter
创建路由配置,指定路径、组件、loader 和 action。<RouterProvider>
渲染路由。useLoaderData
获取 loader 返回的数据,或通过 <Form>
触发 action。示例场景:一个博客应用在访问文章页面时通过 loader 加载文章内容,用户提交评论时通过 action 保存评论并刷新页面。
定义:框架模式将 React Router 转变为一个完整的开发框架,包含声明式和数据模式的所有功能,并添加了高级特性,如服务器端渲染、代码分割和静态预渲染。
特点:
适用场景:
使用方法:
src/routes/
目录中创建文件,自动生成路由(文件式路由)。示例场景:一个新闻网站使用框架模式,通过文件式路由定义文章和分类页面,服务器端渲染首屏内容以提高 SEO,代码分割减少加载时间。
以下表格总结了三种模式的特点和适用场景:
模式 | 功能范围 | 主要 API | 适用项目类型 | 复杂度 |
---|---|---|---|---|
声明式 | 基本路由、页面导航 | <BrowserRouter> 、<Route> 、<Link> | 简单 SPA,如个人网站 | 低 |
数据 | 路由 + 数据加载/修改 | createBrowserRouter 、loader、action | 动态数据应用,如博客或仪表板 | 中 |
框架 | 全栈功能(SSR、代码分割等) | Vite 插件、文件式路由、SSR 配置 | 复杂全栈应用,如电商或 CMS | 高 |
选择建议:
以下是每种模式的基本使用步骤,适合初学者理解:
npm install react-router
。<BrowserRouter>
:
import { BrowserRouter, Routes, Route } from "react-router";
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</BrowserRouter>
);
}
<Link>
实现导航:
import { Link } from "react-router";
function Home() {
return <Link to="/about">关于我们</Link>;
}
npm install react-router
。import { createBrowserRouter, RouterProvider } from "react-router";
const router = createBrowserRouter([
{
path: "/posts",
element: <Posts />,
loader: async () => {
const posts = await fetch("/api/posts").then(res => res.json());
return { posts };
},
action: async ({ request }) => {
const formData = await request.formData();
await fetch("/api/posts", { method: "POST", body: formData });
return { success: true };
},
},
]);
function App() {
return <RouterProvider router={router} />;
}
import { useLoaderData, Form } from "react-router";
function Posts() {
const { posts } = useLoaderData();
return (
<div>
{posts.map(post => <p>{post.title}</p>)}
<Form method="post">
<input name="title" />
<button type="submit">添加文章</button>
</Form>
</div>
);
}
npm create vite@latest my-app -- --template react
npm install @react-router/dev react-router
src/routes/
中添加文件,如 index.tsx
和 products/[pid].tsx
。// src/routes/products/[pid].tsx
import { useLoaderData } from "react-router";
export async function loader({ params }) {
const product = await fetch(`/api/products/${params.pid}`).then(res => res.json());
return { product };
}
export default function Product() {
const { product } = useLoaderData();
return <h1>{product.name}</h1>;
}
除了三种模式,React Router 7 还带来了以下改进:
json
和 defer
方法,推荐直接返回对象或使用 Response.json()
,简化代码。react-router
包,减少依赖管理复杂性。React Router 7 提供了从 v6 升级的平滑路径,尤其是启用了所有未来标志(future flags)的 v6 项目。官方文档提供了详细的升级指南,建议先升级到最新的 v6.x 版本,然后逐步启用 v7 的新功能。Remix v2 用户也可以升级到 React Router 7,享受改进的类型安全和路由功能。
React Router 7 通过声明式、数据和框架三种模式,满足了从简单路由到全栈开发的各种需求。声明式模式适合快速构建简单的单页应用,数据模式简化了动态数据管理,框架模式则为复杂项目提供了强大的工具集。配合类型安全性和性能优化的改进,React Router 7 是 React 开发者构建现代应用的理想选择。
更多详细信息和代码示例,请访问 React Router 官方文档 或相关升级指南。