ToB企服应用市场:ToB评测及商务社交产业平台

标题: 前端React Router从入门到进阶实战 [打印本页]

作者: 梦应逍遥    时间: 2025-1-10 11:09
标题: 前端React Router从入门到进阶实战
React Router 是 React 应用中的一个紧张库,它用于实现客户端的路由管理,能够将 URL 路径与 React 组件关联起来,从而实现页面之间的导航。React Router 不会像传统的多页面应用那样重新加载页面,而是通过组件切换来呈现差别的视图,这使得 React 应用能够拥有更高的性能和更流畅的用户体验。
React Router 是 React 生态中最常用的路由库,用于在 React 应用中处置惩罚页面的导航和路由。它允许开发者通过 URL 映射到差别的组件,从而创建单页应用(SPA)。React Router 通过声明式方式管理路由的设置,支持嵌套路由、动态路由、路由守卫、重定向等功能。
知识框架

1. React Router 基本概念

1.1 路由与组件的关系

React Router 的焦点思想是将 URL 与组件关联,匹配到某个路由时,渲染对应的组件。

1.2 路由的焦点组件


1.3 路由的生命周期

React Router 会监听 URL 的变革,当 URL 发生变革时,它会匹配最合适的 Route,并渲染对应的组件。
2. React Router 版本变革

2.1 React Router v5


2.2 React Router v6


3.React Router 主要组件

1. Router 组件

React Router 提供了多个 Router 组件来管理路由:

  1. import { BrowserRouter as Router } from 'react-router-dom';
  2. function App() {
  3.   return (
  4.     <Router>
  5.       {/* 路由定义和组件 */}
  6.     </Router>
  7.   );
  8. }
复制代码
2. Route 组件

<Route> 用于界说路径和渲染的组件。它根据当前路径来判定是否匹配,并渲染对应的组件。
  1. import { Route } from 'react-router-dom';
  2. <Route path="/home" component={Home} />
复制代码

3. Link 组件

<Link> 用于在差别的路由之间举行导航。它通过 to 属性指定目标路由。
  1. import { Link } from 'react-router-dom';
  2. <Link to="/about">About</Link>
复制代码
4. Switch / Routes 组件


  1. import { Routes, Route } from 'react-router-dom';
  2. <Routes>
  3.   <Route path="/" element={<Home />} />
  4.   <Route path="/about" element={<About />} />
  5. </Routes>
复制代码
5. useNavigate (React Router v6)

useNavigate 是一个钩子,用于在函数组件中举行编程式导航。
  1. import { useNavigate } from 'react-router-dom';
  2. const SomeComponent = () => {
  3.   const navigate = useNavigate();
  4.   const goToHome = () => {
  5.     navigate('/home');
  6.   };
  7.   return <button onClick={goToHome}>Go to Home</button>;
  8. };
复制代码
6. useParams

useParams 是一个钩子,用于在路由中获取动态参数(如路径中的 :id)。
  1. import { useParams } from 'react-router-dom';
  2. const Post = () => {
  3.   const { id } = useParams(); // 获取 URL 参数
  4.   return <div>Post ID: {id}</div>;
  5. };
复制代码
7. useLocation

useLocation 可以访问当前 URL 的信息(路径、查询参数等)。
  1. import { useLocation } from 'react-router-dom';
  2. const CurrentLocation = () => {
  3.   const location = useLocation();
  4.   return <div>Current path: {location.pathname}</div>;
  5. };
复制代码
8. useMatch

useMatch 用来查抄当前的 URL 是否与某个路径匹配,并获取路由参数。
  1. import { useMatch } from 'react-router-dom';
  2. const MatchTest = () => {
  3.   const match = useMatch('/post/:id');
  4.   return match ? <div>Matched Post ID: {match.params.id}</div> : <div>No match</div>;
  5. };
复制代码
4.React Router 高级用法

1. 嵌套路由

React Router 支持路由嵌套,父组件的路由可以嵌套显示子路由。通过 <Outlet> 占位符渲染子路由。
  1. import { Routes, Route, Outlet } from 'react-router-dom';
  2. const Dashboard = () => (
  3.   <div>
  4.     <h2>Dashboard</h2>
  5.     <Outlet />  {/* 子路由会渲染在这里 */}
  6.   </div>
  7. );
  8. const Settings = () => <div>Settings Page</div>;
  9. function App() {
  10.   return (
  11.     <Routes>
  12.       <Route path="/dashboard" element={<Dashboard />}>
  13.         <Route path="settings" element={<Settings />} />
  14.       </Route>
  15.     </Routes>
  16.   );
  17. }
复制代码
2. 路由重定向

React Router 允许通过 <Navigate> 实现路由重定向(在 v6 中取代了 v5 中的 <Redirect>)。
  1. import { Navigate } from 'react-router-dom';
  2. <Route path="/old-path" element={<Navigate to="/new-path" />} />
复制代码
3. 路由守卫

React Router 自己没有内置的路由守卫功能,但可以通过编程方式实现。比方,如果用户没有登录,可以重定向到登录页面。
  1. import { Navigate } from 'react-router-dom';
  2. const ProtectedRoute = ({ children }) => {
  3.   const isAuthenticated = false; // 认证逻辑
  4.   return isAuthenticated ? children : <Navigate to="/login" />;
  5. };
  6. <Routes>
  7.   <Route path="/profile" element={<ProtectedRoute><Profile /></ProtectedRoute>} />
  8. </Routes>
复制代码
4. 动态加载组件(代码分割)

React Router 可以与 React.lazy() 和 Suspense 一起使用,按需加载组件。
  1. import React, { Suspense, lazy } from 'react';
  2. import { Routes, Route } from 'react-router-dom';
  3. const LazyHome = lazy(() => import('./Home'));
  4. function App() {
  5.   return (
  6.     <Routes>
  7.       <Route path="/" element={<Suspense fallback={<div>Loading...</div>}><LazyHome /></Suspense>} />
  8.     </Routes>
  9.   );
  10. }
复制代码
5. 查询参数

React Router 提供了获取 URL 查询参数的功能,可以通过 useSearchParams 钩子来处置惩罚。
  1. import { useSearchParams } from 'react-router-dom';
  2. const SearchPage = () => {
  3.   const [searchParams, setSearchParams] = useSearchParams();
  4.   const query = searchParams.get('q');  // 获取查询参数
  5.   return <div>Search query: {query}</div>;
  6. };
复制代码
5.React Router 设置示例

简单路由设置(React Router v6)

  1. import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
  2. const Home = () => <h1>Home Page</h1>;
  3. const About = () => <h1>About Page</h1>;
  4. function App() {
  5.   return (
  6.     <Router>
  7.       <Routes>
  8.         <Route path="/" element={<Home />} />
  9.         <Route path="/about" element={<About />} />
  10.       </Routes>
  11.     </Router>
  12.   );
  13. }
复制代码
动态路由设置

  1. import { BrowserRouter as Router, Routes, Route, useParams } from 'react-router-dom';
  2. const Post = () => {
  3.   const { id } = useParams();  // 获取动态路由参数
  4.   return <h2>Post {id}</h2>;
  5. };
  6. function App() {
  7.   return (
  8.     <Router>
  9.       <Routes>
  10.         <Route path="/post/:id" element={<Post />} />
  11.       </Routes>
  12.     </Router>
  13.   );
  14. }
复制代码
6. 常用的 React Router 功能实战

3.1 基本用法

  1. import React from 'react';
  2. import { BrowserRouter as Router, Route, Link, Switch } from 'react-router-dom';
  3. const Home = () => <div>Home</div>;
  4. const About = () => <div>About</div>;
  5. function App() {
  6.   return (
  7.     <Router>
  8.       <nav>
  9.         <Link to="/">Home</Link>
  10.         <Link to="/about">About</Link>
  11.       </nav>
  12.       <Switch>
  13.         <Route exact path="/" component={Home} />
  14.         <Route path="/about" component={About} />
  15.       </Switch>
  16.     </Router>
  17.   );
  18. }
  19. export default App;
复制代码
3.2 动态路由

  1. import React from 'react';
  2. import { BrowserRouter as Router, Route, Link, useParams } from 'react-router-dom';
  3. const Post = () => {
  4.   const { id } = useParams(); // 获取动态路由的参数
  5.   return <div>Post ID: {id}</div>;
  6. };
  7. function App() {
  8.   return (
  9.     <Router>
  10.       <nav>
  11.         <Link to="/post/1">Post 1</Link>
  12.         <Link to="/post/2">Post 2</Link>
  13.       </nav>
  14.       <Route path="/post/:id" component={Post} />
  15.     </Router>
  16.   );
  17. }
  18. export default App;
复制代码
3.3 编程式导航 (React Router v6)

  1. import React from 'react';
  2. import { useNavigate } from 'react-router-dom';
  3. const Home = () => {
  4.   const navigate = useNavigate();
  5.   const handleClick = () => {
  6.     navigate('/about');
  7.   };
  8.   return (
  9.     <div>
  10.       <h1>Home</h1>
  11.       <button onClick={handleClick}>Go to About</button>
  12.     </div>
  13.   );
  14. };
  15. export default Home;
复制代码
3.4 嵌套路由

  1. import React from 'react';
  2. import { BrowserRouter as Router, Route, Link, Outlet } from 'react-router-dom';
  3. const Dashboard = () => (
  4.   <div>
  5.     <h2>Dashboard</h2>
  6.     <nav>
  7.       <Link to="settings">Settings</Link>
  8.     </nav>
  9.     <Outlet /> {/* 渲染嵌套路由的占位符 */}
  10.   </div>
  11. );
  12. const Settings = () => <div>Settings Page</div>;
  13. function App() {
  14.   return (
  15.     <Router>
  16.       <Route path="dashboard" element={<Dashboard />}>
  17.         <Route path="settings" element={<Settings />} />
  18.       </Route>
  19.     </Router>
  20.   );
  21. }
  22. export default App;
复制代码
7. 高级用法实战

4.1 路由重定向


v5
  1. import { Redirect } from 'react-router-dom';
  2. // 重定向到首页
  3. <Route path="/old-path">
  4.   <Redirect to="/" />
  5. </Route>
复制代码
v6
  1. import { Navigate } from 'react-router-dom';
  2. <Route path="/old-path" element={<Navigate to="/" />} />
复制代码
4.2 路由守卫(保护路由)

React Router 自己不提供守卫功能,但可以通过编程方式举行实现,比方根据用户的认证状态来决定是否跳转到登录页。
  1. import { Navigate } from 'react-router-dom';
  2. const ProtectedRoute = ({ element, ...rest }) => {
  3.   const isAuthenticated = false; // 用户是否认证
  4.   return isAuthenticated ? element : <Navigate to="/login" />;
  5. };
  6. // 使用
  7. <Route path="/profile" element={<ProtectedRoute element={<Profile />} />} />
复制代码
4.3 通过 useLocation 获取当前 URL

  1. import { useLocation } from 'react-router-dom';
  2. const CurrentLocation = () => {
  3.   const location = useLocation();
  4.   return <div>Current URL: {location.pathname}</div>;
  5. };
复制代码
4.4 动态加载组件

通过 React.lazy 和 Suspense 实现按需加载。
  1. import React, { Suspense, lazy } from 'react';
  2. import { BrowserRouter as Router, Route } from 'react-router-dom';
  3. const LazyHome = lazy(() => import('./Home'));
  4. function App() {
  5.   return (
  6.     <Router>
  7.       <Suspense fallback={<div>Loading...</div>}>
  8.         <Route path="/" component={LazyHome} />
  9.       </Suspense>
  10.     </Router>
  11.   );
  12. }
复制代码
8. React Router 底层焦点原理

   8.1 焦点原理
  
  8.2 关键步调
    React Router 底层的焦点原理围绕着以下几个关键点:

地更新组件。

明白这些底层原理,能够资助你更好地使用 React Router,并且在碰到复杂路由需求时,能够更机动地调整和优化路由设置。
总结

React Router 是构建 React 应用的路由管理工具,具有强大的功能,如支持动态路由、嵌套路由、导航守卫、代码分割等。明白其焦点概念及高级用法,可以资助开发者更高效地构建和维护复杂的 React 应用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4