前言
React 路由是现代单页应用的核心基础,它通过 URL 变化管理组件展示逻辑,实现无刷新页面切换。作为 React 官方的路由解决方案,react-router-dom 提供了声明式的路由配置和灵活的导航控制。我将带你明白路由基础实现、三种参数传递方式以及集中式路由配置模式。
-
React 路由是什么?
- 路由用于控制单页应用中不同组件的展示,通过 URL 的变化来切换组件。
- 单页应用只有一个 HTML 文件,页面切换通过组件控制实现。
- React 官方提供了
react-router-dom包,帮助开发者实现路由功能。
-
路由怎么实现的?
- 安装
react-router-dom,引入BrowserRouter、Routes和Route组件。 - 使用
BrowserRouter包裹整个应用,声明使用浏览器历史模式。 - 通过
Routes和Route配置路由规则,指定路径和对应的组件。 - 使用
Link组件实现导航,点击链接自动切换 URL 并展示对应的组件。 - BrowserRouter:history模式 的路由, HashRouter:hash模式比history多了一个#号符
- Routes:路由出口,是一个路由列表
- Route:路由列表项,配置了路径和组件的映射关系
- 安装
import { BrowserRouter, Routes, Route, Link} from "react-router-dom";
import About from "./views/About.jsx";
import Home from "./views/Home.jsx";
import User from "./views/User.jsx";
function App() {
return (
<div>
<BrowserRouter>
<Link to={"/home"}>首页</Link>
<Link to={"/about"}>关于</Link>
<Routes>
<Route path="/home" element={<Home />}></Route>
<Route path="/about" element={<About />}></Route>
<Route path="/user" element={<User />}></Route>
{/* 配置Routes出口后会默认给一个标签<Home></Home> */}
</Routes>
</BrowserRouter>
</div>
);
}
export default App;
现需要注意的是单个html里面配置的路由,要使用标签包裹其他标签例如:标签
-
动态跳转与参数传递
-
除了使用
Link,还可以使用useNavigate钩子函数实现编程式导航。 -
在组件中引入
useNavigate,调用返回的函数并传入目标路径,实现跳转。 -
路由跳转时可携带参数,如
navigate('/user?id=1')。 -
在目标组件中使用
useSearchParams钩子获取 URL 中的参数。
-
import {useNavigate } from "react-router-dom"
function Home(){
const navigate = useNavigate()
return(
<div>主页
<button onClick={()=>{navigate('/user?id=1')}}>去用户页面</button>
{/* 路由传参 */}
</div>
)
}
export default Home
通过useNavigate跳转 到user界面并在路径当中传递参数
import { useSearchParams } from "react-router-dom"
function User(){
const [params] = useSearchParams()
return (
<div>
<h1>用户页面---{params.get('id')}</h1>
</div>
)
}
export default User;
在user中通过useSearchParams拿到Home页面中传递过来的参数,除了这种传参方式以外还有另外两种传参方式
路由的三种传参方式:
1. **查询参数传参 **
- 发送参数:
navigate('/home?id=1') - 获取参数:
import { useSearchParams } from "react-router-dom"; function Home() { const [searchParams] = useSearchParams(); const id = searchParams.get('id'); // '1' } - 特点:
- 参数显示在 URL 中(
/home?id=1) - 刷新页面参数保留
- 适合传递简单数据(筛选条件、分页等)
- 参数显示在 URL 中(
2. **路径参数传参 **
- 路由配置:
<Route path="/user/:id" element={<User />} /> - 发送参数:
navigate('/user/1') - 获取参数:
import { useParams } from "react-router-dom"; function User() { const { id } = useParams(); // { id: '1' } } - 特点:
- 参数成为 URL 的一部分(
/user/1) - 刷新页面参数保留
- 适合资源定位(用户ID、文章ID等)
- 参数值始终是字符串类型
- 参数成为 URL 的一部分(
3. 状态传参 (State)
-
发送参数:
navigate('/dashboard', { state: { id: 1, name: "John" } }) -
获取参数:
import { useLocation } from "react-router-dom"; function Dashboard() { const location = useLocation(); const { id, name } = location.state || {}; } -
特点:
- 参数不会显示在 URL 中
- 刷新页面参数会丢失(只存在于会话历史中)
- 适合传递敏感数据或大对象
- 需要处理可能的
undefined状态
关键区别总结
| 特性 | 查询参数 | 路径参数 | 状态传参 |
|---|---|---|---|
| URL 可见性 | 可见 (?id=1) | 可见 (/user/1) | 不可见 |
| 参数类型 | 字符串 | 字符串 | 任意类型 |
| 路由配置 | 不需要特殊配置 | 需要定义参数路径 | 不需要配置 |
| 使用场景 | 筛选条件、分页 | 资源标识、固定参数 | 敏感数据、临时状态 |
| 获取方式 | useSearchParams() | useParams() | useLocation().state |
集中式路由配置的配置方式(另一种路由配置方式)
- 集中式路由配置,将所有配置路由都放在一个文件中,方便管理()
- 路由的懒加载:将每个路由组件都用React.lazy包裹,然后通过React.Suspense包裹起来, 这样当某个路由被访问时,才会加载对应的组件(为提高首页加载速度)。
import React from "react";
import {
BrowserRouter,
Routes,
Route,
Navigate,
useRoutes,
} from "react-router";
const Login=React.lazy(()=>import("../Pages/Login"))
const routes = [
{
path: "/",
element: <noteClass />,
},
{
path: "/login",
element: <Login />,
},
];
function WrapperRoutes() {
// useRoutes这个hooks只能被用在路由组件中,该组件不能被抛出
//<Routes></Routes>
let ele = useRoutes(routes);
return ele;
}
export default function WrapperRouter(){
return (
<BrowserRouter>
<WrapperRoutes />
</BrowserRouter>
)
}
与传统方式的对比
| 特性 | 组件式路由 | 集中式路由 |
|---|---|---|
| 配置位置 | 分散在各组件中 | 集中在单一文件 |
| 可维护性 | 修改需查找多个文件 | 修改只需一个文件 |
| 懒加载 | 需在每个组件单独处理 | 统一处理更简洁 |
| 路由结构 | 嵌套结构分散 | 整体结构一目了然 |
| 适用场景 | 小型项目 | 中大型项目 |
总结
-
基础路由搭建
BrowserRouter作为路由容器Routes/Route定义路径-组件映射Link实现声明式导航
-
参数传递三方式
方式 适用场景 获取方法 数据持久性 查询参数 筛选条件/分页 useSearchParams()✅ 路径参数 资源ID定位 useParams()✅ 状态参数 敏感数据/大对象 useLocation().state❌ -
集中式路由优势
- 统一管理路由配置,提升可维护性
- 配合
React.lazy+Suspense实现按需加载 - 特别适合中大型项目架构