在前端开发中,或许你已经了解过路由的概念,它能帮你在前端实现页面的更新,而不需要向后端进行请求,这对性能来说无疑是一个巨大的优化。
但是,当项目逐渐复杂时,你会发现,单靠一级路由很难满足需求,这时候,二级路由就像一个“导航分层器”,能帮你把页面拆分成更细的部分。
今天,我将从二级路由的概念、使用方法,应用场景和工作流程出发,带你深入了解。
一、一级路由与二级路由的核心概念
1. 一级路由
也可以叫做主路由,它就像是一个应用的“主菜单”,比如你的网站有首页、关于页、登录页,这些一般都是作为一级路由。
一级路由的特点通常包括:
- 全局导航:定义主要页面路径(如
/home),实现点击导航栏跳转到主页面等功能。 - 通用布局:比如顶部导航栏或侧边栏,需要在所有页面都能看到的结构。
2. 二级路由
通常也叫做子路由,二级路由好比是“主菜单下的子菜单”,比如在首页下面,通常会再细分出“新闻”和“消息”两个页面。
它的特点包括:
- 嵌套结构:路径会继承父路由的前缀,比如
/home/news。 - 局部更新:切换子路由时,只有部分内容变化,其他布局保持不变。
- 模块化管理:将复杂页面拆分成独立组件,便于维护。
举个例子:
如果一级路由是 /home,它的子路由可能是 /home/news 和 /home/messages,用户点击“新闻”时,URL 变成 /home/news,而顶部导航栏仍然保留。
二、路由工作流程
-
用户访问
/home/news- React Router 匹配根路径
/,渲染Layout组件。 Layout中的<Outlet />会查找匹配的子路由/home/news。- 渲染
Home组件,并在其<Outlet />中渲染News组件。
- React Router 匹配根路径
-
用户点击
Messages链接- URL 变为
/home/messages。 - 重新匹配子路由
/home/messages,替换<Outlet />内容为Messages组件。
- URL 变为
-
用户访问
/- 匹配根路径
/,渲染Layout和默认子路由Home。
- 匹配根路径
三、结合代码案例讲解
1. 根路由配置
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Layout from './Layout';
import Home from './pages/Home';
import About from './pages/About';
import NotFound from './pages/NotFound';
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<Home />} />
<Route path="about" element={<About />} />
</Route>
<Route path="*" element={<NotFound />} />
</Routes>
</BrowserRouter>
);
}
功能说明:
这段代码定义了整个应用的主路由结构。
<Route path="/" element={<Layout />}>:通过根路径/渲染Layout组件,当用户地址输入为/时,会自动跳转到Layout页面。Layout的子路由包括/home和/about。<Route path="*" element={<NotFound />} />:表示所有未匹配的路径会跳转到 NotFound 页面。
详细解析:
-
<BrowserRouter>- 这个组件就像是整个应用的导航控制器,它使用浏览器的
historyAPI 实现 URL 变化时的无刷新导航。 - 小贴士:整个应用必须被这个组件包裹,否则路由功能无法生效。
- 这个组件就像是整个应用的导航控制器,它使用浏览器的
-
<Routes>- 这个标签包裹了所有路由规则,可以看作是一个“路由列表”。
- 它会按顺序匹配第一个符合当前 URL 的
<Route>。
-
<Route path="/" element={<Layout />}>- 这里定义了一级路由,路径是根路径
/。 - 当用户访问
/时,会渲染Layout组件(包含导航栏)。
- 这里定义了一级路由,路径是根路径
-
嵌套子路由
<Route index element={<Home />} /> <Route path="about" element={<About />} />index:这是个特殊标记,表示当用户访问/时,默认显示Home组件。path="about":定义子路由路径/about。由于父路由是/,所以完整路径是/about。
-
<Route path="*" element={<NotFound />}>- 这个路径是通配符,用于兜底所有未匹配的路由(比如用户访问
/404)。
- 这个路径是通配符,用于兜底所有未匹配的路由(比如用户访问
2. 父组件 Layout
功能说明:
这个组件定义了应用的公共布局(导航栏),并通过 <Outlet /> 渲染子路由内容。
import { Outlet, Link } from 'react-router-dom';
function Layout() {
return (
<div>
<nav>
<Link to="/">Home</Link>
<Link to="/about">About</Link>
</nav>
<Outlet /> {/* 子路由内容渲染位置 */}
</div>
);
}
逐句解析:
-
<Outlet />- 这是 React Router 提供的一个“占位符”,它的作用是告诉 React:“这里要放子路由的内容”。
- 比如用户访问
/about时,<Outlet />会被替换成About组件。
-
<Link to="/">- 这是导航链接,点击后会更新 URL 并触发路由匹配。
- 小技巧:
to属性的路径是相对路径,比如/表示根路径,/about表示绝对路径。
3. 子路由组件 Home.js
功能说明:
这个组件定义了 /home 路径下的子路由(/home/news 和 /home/messages),并通过 <Outlet /> 渲染子路由内容。
import { Link, Outlet } from 'react-router-dom';
function Home() {
return (
<div>
<h1>Home Page</h1>
<nav>
<Link to="news">News</Link>
<Link to="messages">Messages</Link>
</nav>
<Outlet /> {/* 子路由内容渲染位置 */}
</div>
);
}
逐句解析:
-
<Link to="news">- 这里的
to是相对路径,完整路径会变成/home/news(因为父路由是/home)。 - 注意:子路由的路径是相对于父路由的,不需要重复写
/home。
- 这里的
-
<Outlet />- 这个标签会渲染
/home/news或/home/messages对应的组件内容。
- 这个标签会渲染
4. 子路由组件 News.js
功能说明:
这个组件定义了 /home/news 路径下的页面内容。
import { useParams } from 'react-router-dom';
function News() {
return (
<div>
<h2>News Page</h2>
<p>This is the news content.</p>
</div>
);
}
逐句解析:
useParams()- 如果需要从 URL 提取动态参数(比如
/user/123),可以通过这个 Hook 获取参数对象。 - 举个例子:如果路径是
/user/:id,访问/user/456时,useParams()会返回{ id: "456" }。
- 如果需要从 URL 提取动态参数(比如
5. 动态参数路由示例
功能说明:
这段代码定义了动态路由 /user/:id,用于显示用户信息页面。
// 路由配置
<Route path="/user/:id" element={<UserProfile />} />
// 用户信息组件
import { useParams } from 'react-router-dom';
function UserProfile() {
const { id } = useParams(); // 获取 URL 中的 id 参数
return <div>User ID: {id}</div>;
}
逐句解析:
-
:id- 这是动态参数的写法,
:后面的名称可以是任意合法的标识符(比如:id、:username)。 - 访问
/user/123时,id的值会变成"123"。
- 这是动态参数的写法,
-
useParams()- 这个 Hook 会返回一个对象,包含所有动态参数。
- 小贴士:动态参数只能匹配非斜杠的字符,比如
/user/123是合法的,但/user/123/456会被匹配为/user/123并忽略/456。
四、二级路由的优点与适用场景
优点:
- 模块化设计:通过分层路由将复杂页面拆解为独立组件,降低耦合度。
- 性能优化:切换子路由时,只有部分内容变化,避免全量渲染。
- 导航一致性:在父路由中统一管理公共布局(如导航栏),确保界面风格统一。
适用场景:
- 后台管理系统:左侧菜单导航 + 右侧内容区域的典型布局。
- 电商平台:首页下嵌套商品分类、详情页。
- 多级表单流程:分步骤引导用户完成注册、支付等操作。