1730 字
9 分钟

React Router

React Router#

React Router是React官方推荐的路由库,用于在React应用中实现页面导航和路由管理。它允许你根据URL的变化显示不同的组件,实现单页应用(SPA)的导航体验。

1. 安装React Router#

React Router有多个包,其中最常用的是react-router-dom,用于Web应用。

Terminal window
# 使用npm安装
npm install react-router-dom
# 使用yarn安装
yarn add react-router-dom
# 使用pnpm安装
pnpm add react-router-dom

2. 基本用法#

配置路由#

首先,你需要在应用的根组件中配置路由。

import React from 'react';
import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';
import Home from './Home';
import About from './About';
import Contact from './Contact';
function App() {
return (
<Router>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
<li>
<Link to="/contact">Contact</Link>
</li>
</ul>
</nav>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/contact" element={<Contact />} />
</Routes>
</div>
</Router>
);
}
export default App;

创建路由组件#

接下来,你需要创建对应的路由组件。

Home.jsx
import React from 'react';
function Home() {
return <h1>Home Page</h1>;
}
export default Home;
// About.jsx
import React from 'react';
function About() {
return <h1>About Page</h1>;
}
export default About;
// Contact.jsx
import React from 'react';
function Contact() {
return <h1>Contact Page</h1>;
}
export default Contact;

3. 路由参数#

路由参数允许你在URL中传递参数,例如用户ID、产品ID等。

配置带参数的路由#

import React from 'react';
import { BrowserRouter as Router, Routes, Route, Link, useParams } from 'react-router-dom';
import Home from './Home';
import User from './User';
function App() {
return (
<Router>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/user/1">User 1</Link>
</li>
<li>
<Link to="/user/2">User 2</Link>
</li>
</ul>
</nav>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/user/:id" element={<User />} />
</Routes>
</div>
</Router>
);
}
export default App;

在组件中获取路由参数#

User.jsx
import React from 'react';
import { useParams } from 'react-router-dom';
function User() {
// 使用useParams Hook获取路由参数
const { id } = useParams();
return <h1>User {id}</h1>;
}
export default User;

4. 嵌套路由#

嵌套路由允许你在一个路由组件中嵌套另一个路由组件,实现更复杂的导航结构。

配置嵌套路由#

import React from 'react';
import { BrowserRouter as Router, Routes, Route, Link, Outlet } from 'react-router-dom';
import Home from './Home';
import Dashboard from './Dashboard';
import Profile from './Profile';
import Settings from './Settings';
function App() {
return (
<Router>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/dashboard">Dashboard</Link>
</li>
</ul>
</nav>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/dashboard" element={<Dashboard />}>
<Route path="profile" element={<Profile />} />
<Route path="settings" element={<Settings />} />
</Route>
</Routes>
</div>
</Router>
);
}
export default App;

创建父路由组件#

Dashboard.jsx
import React from 'react';
import { Link, Outlet } from 'react-router-dom';
function Dashboard() {
return (
<div>
<h1>Dashboard</h1>
<nav>
<ul>
<li>
<Link to="profile">Profile</Link>
</li>
<li>
<Link to="settings">Settings</Link>
</li>
</ul>
</nav>
{/* Outlet用于渲染子路由组件 */}
<Outlet />
</div>
);
}
export default Dashboard;

创建子路由组件#

Profile.jsx
import React from 'react';
function Profile() {
return <h2>Profile Page</h2>;
}
export default Profile;
// Settings.jsx
import React from 'react';
function Settings() {
return <h2>Settings Page</h2>;
}
export default Settings;

5. 编程式导航#

编程式导航允许你通过代码而不是链接来导航到不同的路由。

使用useNavigate Hook#

import React from 'react';
import { useNavigate } from 'react-router-dom';
function Login() {
const navigate = useNavigate();
const handleLogin = () => {
// 登录逻辑
// 登录成功后导航到首页
navigate('/');
};
return (
<div>
<h1>Login Page</h1>
<button onClick={handleLogin}>Login</button>
</div>
);
}
export default Login;

导航到带参数的路由#

import React from 'react';
import { useNavigate } from 'react-router-dom';
function UserList() {
const navigate = useNavigate();
const navigateToUser = (id) => {
navigate(`/user/${id}`);
};
return (
<div>
<h1>User List</h1>
<button onClick={() => navigateToUser(1)}>User 1</button>
<button onClick={() => navigateToUser(2)}>User 2</button>
</div>
);
}
export default UserList;

导航到上一页#

import React from 'react';
import { useNavigate } from 'react-router-dom';
function Detail() {
const navigate = useNavigate();
const goBack = () => {
navigate(-1);
};
return (
<div>
<h1>Detail Page</h1>
<button onClick={goBack}>Go Back</button>
</div>
);
}
export default Detail;

6. 路由守卫#

路由守卫用于控制路由的访问权限,例如需要登录才能访问的页面。

创建私有路由组件#

import React from 'react';
import { Route, Navigate } from 'react-router-dom';
// 模拟登录状态
const isLoggedIn = true;
function PrivateRoute({ element }) {
return isLoggedIn ? element : <Navigate to="/login" />;
}
export default PrivateRoute;

使用私有路由#

import React from 'react';
import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';
import Home from './Home';
import Login from './Login';
import Dashboard from './Dashboard';
import PrivateRoute from './PrivateRoute';
function App() {
return (
<Router>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/login">Login</Link>
</li>
<li>
<Link to="/dashboard">Dashboard</Link>
</li>
</ul>
</nav>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/login" element={<Login />} />
<Route path="/dashboard" element={<PrivateRoute element={<Dashboard />} />} />
</Routes>
</div>
</Router>
);
}
export default App;

7. 路由状态#

路由状态允许你在导航时传递额外的状态信息,这些信息不会显示在URL中。

导航时传递状态#

import React from 'react';
import { Link, useLocation } from 'react-router-dom';
function Home() {
return (
<div>
<h1>Home Page</h1>
<Link to="/dashboard" state={{ from: 'home', message: 'Welcome to Dashboard' }}>
Go to Dashboard
</Link>
</div>
);
}
function Dashboard() {
const location = useLocation();
const { from, message } = location.state || {};
return (
<div>
<h1>Dashboard</h1>
{from && <p>From: {from}</p>}
{message && <p>Message: {message}</p>}
</div>
);
}

8. 404页面#

404页面用于处理不存在的路由。

配置404页面#

import React from 'react';
import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';
import Home from './Home';
import About from './About';
import NotFound from './NotFound';
function App() {
return (
<Router>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
<li>
<Link to="/nonexistent">Nonexistent Page</Link>
</li>
</ul>
</nav>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
{/* 404页面,放在所有路由的最后 */}
<Route path="*" element={<NotFound />} />
</Routes>
</div>
</Router>
);
}
export default App;

创建404组件#

NotFound.jsx
import React from 'react';
import { Link } from 'react-router-dom';
function NotFound() {
return (
<div>
<h1>404 - Page Not Found</h1>
<p>The page you are looking for does not exist.</p>
<Link to="/">Go back to Home</Link>
</div>
);
}
export default NotFound;

9. 最佳实践#

  1. 使用BrowserRouter:对于大多数Web应用,推荐使用BrowserRouter,它使用HTML5的history API,提供更干净的URL。
  2. 组织路由结构:将路由配置集中管理,便于维护和扩展。
  3. 使用嵌套路由:对于复杂的应用,使用嵌套路由可以更好地组织组件结构。
  4. 使用路由守卫:对于需要权限控制的页面,使用路由守卫来限制访问。
  5. 使用编程式导航:对于需要通过代码触发的导航,使用useNavigate Hook。
  6. 处理404页面:为不存在的路由提供友好的404页面。
  7. 使用路由状态:对于不需要显示在URL中的状态信息,使用路由状态。
  8. 优化路由性能:对于大型应用,考虑使用懒加载来优化路由性能。

练习#

  1. 创建一个包含首页、关于页、联系页的基本路由应用。
  2. 创建一个包含用户列表和用户详情的应用,使用路由参数传递用户ID。
  3. 创建一个包含嵌套路由的仪表盘应用,包含个人资料和设置页面。
  4. 创建一个需要登录才能访问的私有路由。
  5. 创建一个404页面,处理不存在的路由。

总结#

在本章节中,我们学习了React Router的使用方法和最佳实践,包括:

  • 安装和配置React Router
  • 基本路由的使用
  • 路由参数的传递和获取
  • 嵌套路由的配置和使用
  • 编程式导航的实现
  • 路由守卫的使用
  • 路由状态的传递和获取
  • 404页面的处理
  • 最佳实践

React Router是React应用中实现页面导航和路由管理的重要工具,掌握它的使用方法将帮助你构建更加复杂和用户友好的React应用。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

React Router
https://firefly.cuteleaf.cn/posts/react/06-react-router/
作者
Lireal
发布于
2026-01-21
许可协议
CC BY-NC-SA 4.0

目录