🚀 React Router 是React生态中最受欢迎的路由库,用于构建单页面应用(SPA)的页面导航系统。版本6是一次重大升级,引入了全新的API和更简洁的语法。本文将带你了解React Router 6的核心概念和实用技巧,助你构建现代化的React应用。
📚 单页应用与路由基础
💡 单页应用的工作原理
什么是SPA?
SPA(Single Page Application)是指整个应用只有一个HTML页面,页面切换时只做局部更新而不刷新整个页面。
单页应用的优势:
- 🚀 更快的用户体验 - 无需频繁刷新页面,避免白屏时间
- 📊 减少服务器压力 - 只需加载必要的数据,而非整个页面
- 🎯 更流畅的交互 - 类似原生应用的体验,无缝过渡
🧭 路由的本质与实现方式
后端路由:
// Express后端路由示例
app.get('/users', (req, res) => {
// 处理用户列表请求
})
前端路由:
// React Router前端路由示例
<Route path="/users" element={<UserList />} />
关键区别:前端路由在浏览器中处理URL变化,不会向服务器发送请求,而是在本地切换显示的组件。
🔄 React Router 6 的革新
React Router 6相比5.x版本有哪些重要变化?
特性 | React Router 5 | React Router 6 |
---|---|---|
路由容器 | <Switch> | <Routes> |
路由定义 | <Route component={Home}> | <Route element={<Home/>}> |
重定向 | <Redirect> | <Navigate> |
路由API | 基于组件的API | 基于Hooks的API |
嵌套路由 | 需要确保路径匹配 | 自动相对路径 |
路由配置 | 主要基于组件声明 | 支持对象配置(useRoutes) |
🧩 路由系统的核心组件
🌐 路由环境容器
<BrowserRouter>
利用 HTML5 的 history API (pushState
, replaceState
等) 实现UI与URL的同步,是最常用的路由容器。
import React from "react";
import ReactDOM from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import App from "./App";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<BrowserRouter>
<App />
</BrowserRouter>
);
而 <HashRouter>
使用URL的哈希部分(即 #
后面的部分)来 保持UI与URL的同步,适用于不支持HTML5 history API的老旧浏览器。
注意
<HashRouter>
的URL中会包含 #
符号,如 http://example.com/#/about
,而 <BrowserRouter>
的URL更干净:http://example.com/about
🛣️ 路由定义与匹配
<Routes>
和 <Route>
是React Router 6中定义路由规则的核心组件:
import { Routes, Route } from "react-router-dom";
function App() {
return (
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/dashboard" element={<Dashboard />} />
</Routes>
);
}
嵌套路由的表达方式更加直观:
<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<Home />} />
<Route path="about" element={<About />} />
<Route path="dashboard" element={<Dashboard />}>
<Route path="stats" element={<DashboardStats />} />
<Route path="profile" element={<UserProfile />} />
</Route>
<Route path="*" element={<NotFound />} />
</Route>
</Routes>