Pixiv - SWKL:D
1730 字
9 分钟
React Router
React Router
React Router是React官方推荐的路由库,用于在React应用中实现页面导航和路由管理。它允许你根据URL的变化显示不同的组件,实现单页应用(SPA)的导航体验。
1. 安装React Router
React Router有多个包,其中最常用的是react-router-dom,用于Web应用。
# 使用npm安装npm install react-router-dom
# 使用yarn安装yarn add react-router-dom
# 使用pnpm安装pnpm add react-router-dom2. 基本用法
配置路由
首先,你需要在应用的根组件中配置路由。
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;创建路由组件
接下来,你需要创建对应的路由组件。
import React from 'react';
function Home() { return <h1>Home Page</h1>;}
export default Home;
// About.jsximport React from 'react';
function About() { return <h1>About Page</h1>;}
export default About;
// Contact.jsximport 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;在组件中获取路由参数
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;创建父路由组件
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;创建子路由组件
import React from 'react';
function Profile() { return <h2>Profile Page</h2>;}
export default Profile;
// Settings.jsximport 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组件
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. 最佳实践
- 使用BrowserRouter:对于大多数Web应用,推荐使用BrowserRouter,它使用HTML5的history API,提供更干净的URL。
- 组织路由结构:将路由配置集中管理,便于维护和扩展。
- 使用嵌套路由:对于复杂的应用,使用嵌套路由可以更好地组织组件结构。
- 使用路由守卫:对于需要权限控制的页面,使用路由守卫来限制访问。
- 使用编程式导航:对于需要通过代码触发的导航,使用useNavigate Hook。
- 处理404页面:为不存在的路由提供友好的404页面。
- 使用路由状态:对于不需要显示在URL中的状态信息,使用路由状态。
- 优化路由性能:对于大型应用,考虑使用懒加载来优化路由性能。
练习
- 创建一个包含首页、关于页、联系页的基本路由应用。
- 创建一个包含用户列表和用户详情的应用,使用路由参数传递用户ID。
- 创建一个包含嵌套路由的仪表盘应用,包含个人资料和设置页面。
- 创建一个需要登录才能访问的私有路由。
- 创建一个404页面,处理不存在的路由。
总结
在本章节中,我们学习了React Router的使用方法和最佳实践,包括:
- 安装和配置React Router
- 基本路由的使用
- 路由参数的传递和获取
- 嵌套路由的配置和使用
- 编程式导航的实现
- 路由守卫的使用
- 路由状态的传递和获取
- 404页面的处理
- 最佳实践
React Router是React应用中实现页面导航和路由管理的重要工具,掌握它的使用方法将帮助你构建更加复杂和用户友好的React应用。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
Lirael's Tech Firefly