<返回目录     Powered by claud/xia兄

第11课: 路由管理

React Router、路由参数、嵌套路由

课程内容

本课程将详细介绍React应用中的路由管理相关知识和实践技巧,包括React Router的基本使用、路由参数、嵌套路由、受保护路由等核心概念。

核心概念

1. 路由管理基础

2. React Router安装与配置

// 安装React Router
npm install react-router-dom

// 或使用yarn
yarn add react-router-dom

3. 基本路由设置

// 基本路由配置
import React from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Home from './pages/Home';
import About from './pages/About';
import Contact from './pages/Contact';
import NotFound from './pages/NotFound';

function App() {
  return (
    
      
        } />
        } />
        } />
        } />
      
    
  );
}

export default App;

4. 导航与链接

// 使用Link和NavLink进行导航
import React from 'react';
import { Link, NavLink } from 'react-router-dom';

function Navigation() {
  return (
    
  );
}

export default Navigation;

5. 路由参数

// 路由参数配置
import React from 'react';
import { Routes, Route, useParams } from 'react-router-dom';

// 文章列表页
function PostList() {
  return (
    

文章列表

  • 文章 1
  • 文章 2
  • 文章 3
); } // 文章详情页 - 使用useParams获取路由参数 function PostDetail() { const { id } = useParams(); return (

文章详情

文章ID: {id}

{/* 根据ID获取文章数据并展示 */}
); } // 路由配置 function App() { return ( } /> } /> } /> } /> ); }

6. 嵌套路由

// 嵌套路由配置
import React from 'react';
import { Routes, Route, Outlet, Link } from 'react-router-dom';

// 布局组件
function Layout() {
  return (
    
{/* 子路由内容将显示在这里 */}
); } // 仪表盘布局 function DashboardLayout() { return (

仪表盘

{/* 仪表盘子路由内容 */}
); } // 仪表盘子页面 function Profile() { return
个人资料页面
; } function Settings() { return
设置页面
; } function Stats() { return
统计数据页面
; } // 路由配置 function App() { return ( }> } /> }> } /> } /> } /> } /> } /> ); }

7. 编程式导航

// 编程式导航
import React from 'react';
import { useNavigate } from 'react-router-dom';

function LoginPage() {
  const navigate = useNavigate();
  
  const handleLogin = () => {
    // 登录逻辑
    const isLoggedIn = true;
    
    if (isLoggedIn) {
      // 登录成功后跳转到首页
      navigate('/');
      
      // 或者带状态跳转
      navigate('/dashboard', {
        state: { message: '登录成功' }
      });
      
      // 替换当前历史记录
      // navigate('/dashboard', { replace: true });
      
      // 后退
      // navigate(-1);
      
      // 前进
      // navigate(1);
    }
  };
  
  return (
    

登录

); } // 接收状态 function Dashboard() { const location = useLocation(); const message = location.state?.message; return (

仪表盘

{message &&

{message}

}
); }

8. 受保护路由

// 受保护路由
import React from 'react';
import { Navigate, Outlet } from 'react-router-dom';
import { useAuth } from './context/AuthContext';

// 受保护路由组件
function ProtectedRoute() {
  const { isAuthenticated, isLoading } = useAuth();
  
  if (isLoading) {
    return 
加载中...
; } if (!isAuthenticated) { return ; } return ; } // 路由配置 function App() { return ( } /> } /> } /> {/* 受保护的路由 */} }> } /> } /> } /> } /> ); }

9. 路由守卫

// 路由守卫示例
import React, { useEffect } from 'react';
import { useNavigate, useLocation } from 'react-router-dom';
import { useAuth } from './context/AuthContext';

// 认证守卫Hook
function useAuthGuard() {
  const { isAuthenticated, isLoading } = useAuth();
  const navigate = useNavigate();
  const location = useLocation();
  
  useEffect(() => {
    if (!isLoading && !isAuthenticated) {
      // 保存当前位置,登录后可以重定向回来
      navigate('/login', {
        state: { from: location }
      });
    }
  }, [isAuthenticated, isLoading, navigate, location]);
  
  return isLoading;
}

// 使用守卫的组件
function ProtectedComponent() {
  const isLoading = useAuthGuard();
  
  if (isLoading) {
    return 
加载中...
; } return (

受保护的内容

{/* 组件内容 */}
); } // 登录后重定向回原页面 function LoginPage() { const { login } = useAuth(); const navigate = useNavigate(); const location = useLocation(); const from = location.state?.from?.pathname || '/'; const handleLogin = async () => { // 登录逻辑 await login('email', 'password'); // 登录成功后重定向回原页面 navigate(from, { replace: true }); }; return (

登录

); }

10. 路由配置最佳实践

11. 路由懒加载

// 路由懒加载
import React, { lazy, Suspense } from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';

// 懒加载组件
const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));
const Contact = lazy(() => import('./pages/Contact'));
const Dashboard = lazy(() => import('./pages/Dashboard'));
const NotFound = lazy(() => import('./pages/NotFound'));

function App() {
  return (
    
      加载中...
}> } /> } /> } /> } /> } /> ); }
最佳实践:
注意事项:

实践练习

练习任务:
  1. 基础练习:

    创建一个React应用,实现以下功能:

    • 安装并配置React Router
    • 创建基本路由(首页、关于、联系)
    • 实现导航菜单
    • 添加404页面
  2. 中级练习:

    扩展基础练习,添加以下功能:

    • 实现嵌套路由(仪表盘及其子页面)
    • 添加路由参数(文章详情页)
    • 实现受保护路由
    • 添加编程式导航
  3. 高级练习:

    进一步优化应用:

    • 实现路由懒加载
    • 添加路由守卫
    • 实现路由元数据
    • 添加面包屑导航
    • 优化路由性能
  4. 综合练习:

    构建一个完整的博客应用,包括:

    • 文章列表页
    • 文章详情页(带评论)
    • 分类和标签页面
    • 搜索功能
    • 管理员后台

React Router API参考

组件/Hook 描述 用途
Router 路由的根组件 包装整个应用
Routes 路由配置容器 包含多个Route
Route 单个路由配置 定义路径和组件
Link 导航链接 页面间导航
NavLink 带激活状态的链接 导航菜单
Outlet 子路由内容出口 嵌套路由
Navigate 导航组件 重定向
useParams 获取路由参数 动态路由
useNavigate 导航函数 编程式导航
useLocation 获取当前位置 访问路由状态
useRoutes 基于配置的路由 集中式路由配置

总结

通过本课程学习,你应该掌握了React路由管理的核心知识和实践技巧:

路由管理是React应用的重要组成部分,合理的路由设计可以提高应用的可维护性和用户体验。继续深入学习和实践,你将能够构建更加复杂和功能完善的React应用。