从路由到状态管理:React Router v6 + Redux Toolkit 一站式完全指南

388 阅读3分钟

前言

在 React 应用开发中,路由管理全局状态管理是两大核心模块。
本文将以一个学生管理系统为例,手把手带你掌握:

  • 如何用 React Router v6 实现动态路由、嵌套布局与编程式导航
  • 如何用 Redux Toolkit 高效管理异步状态(含 CRUD 实战)
    文中包含大量代码示例与设计思路,帮你快速打通 React 应用开发的“任督二脉”!

一、React Router v6:路由管理全解析

1. 路由容器选择:BrowserRouter 还是 HashRouter?

  • BrowserRouter

    • 特点:基于 History API,URL 无 #,需服务端适配
    • 适用场景:生产环境(需配置服务器重定向)
    import { BrowserRouter } from 'react-router-dom';
    const App = () => (
      <BrowserRouter>
        {/* 其他组件 */}
      </BrowserRouter>
    );
    
  • HashRouter

    • 特点:通过 URL Hash 实现,兼容性极佳
    • 适用场景:静态站点、快速原型开发
    import { HashRouter } from 'react-router-dom';
    

2. 路由配置:两种模式任你选

  • 方案 1:组件式配置
    通过 <Routes> 和 <Route> 声明式定义路由:

    import { Routes, Route } from 'react-router-dom';
    const App = () => (
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/students" element={<StudentList />} />
        <Route path="/students/:id" element={<StudentDetail />} />
      </Routes>
    );
    
  • 方案 2:对象式配置(useRoutes)
    集中管理路由,适合复杂项目:

    // 定义路由数组
    const routes = [
      { path: '/', element: <Home /> },
      { 
        path: '/students',
        element: <StudentLayout />,
        children: [
          { index: true, element: <StudentList /> },
          { path: ':id', element: <StudentDetail /> },
        ],
      },
    ];
    // 在组件中使用
    const App = () => useRoutes(routes);
    

3. 嵌套路由与布局复用

  • 关键组件:Outlet
    在父组件中标记子路由渲染位置,实现布局共享:

    // 父组件 StudentLayout.js
    import { Outlet } from 'react-router-dom';
    const StudentLayout = () => (
      <div>
        <h1>学生管理系统</h1>
        <nav>{/* 公共导航 */}</nav>
        <Outlet /> {/* 子路由在此渲染 */}
      </div>
    );
    

4. 路由跳转与导航

  • 声明式导航:NavLink
    自动添加激活状态,适合菜单高亮:

    <NavLink 
      to="/students" 
      className={({ isActive }) => isActive ? 'active' : ''}
    >
      学生列表
    </NavLink>
    
  • 编程式导航:useNavigate
    在事件或异步操作后跳转:

    import { useNavigate } from 'react-router-dom';
    const LoginButton = () => {
      const navigate = useNavigate();
      return <button onClick={() => navigate('/dashboard')}>登录</button>;
    };
    

二、Redux Toolkit:状态管理实战

1. Redux 核心概念

  • Store:全局状态容器
  • Slice:模块化状态单元(如学生模块)
  • Async Thunk:处理异步操作(如 API 请求)

2. 快速创建 Store

通过 configureStore 集成 Reducer 与中间件:

// store.js
import { configureStore } from '@reduxjs/toolkit';
import studentReducer from './StuSlice';

export default configureStore({
  reducer: {
    student: studentReducer, // 模块化状态
  },
});

3. Slice 与异步处理

  • 同步操作:createSlice
    定义状态初始值与同步 Reducer:

    // StuSlice.js
    const studentSlice = createSlice({
      name: 'student',
      initialState: { data: [], status: 'idle' },
      reducers: {
        addStudent: (state, action) => {
          state.data.push(action.payload);
        },
      },
    });
    
  • 异步操作:createAsyncThunk
    处理 API 请求并更新状态:

    export const fetchStudents = createAsyncThunk(
      'student/fetchStudents',
      async () => {
        const res = await fetch('/api/students');
        return res.json();
      }
    );
    
    // 在 extraReducers 中处理生命周期
    extraReducers: (builder) => {
      builder
        .addCase(fetchStudents.pending, (state) => {
          state.status = 'loading';
        })
        .addCase(fetchStudents.fulfilled, (state, action) => {
          state.status = 'succeeded';
          state.data = action.payload;
        });
    };
    

4. 在组件中使用状态

  • 读取状态:useSelector

    const StudentList = () => {
      const students = useSelector(state => state.student.data);
      // 渲染逻辑...
    };
    
  • 派发 Action:useDispatch

    const AddForm = () => {
      const dispatch = useDispatch();
      const handleSubmit = () => {
        dispatch(addStudent(newStudent)); // 同步 Action
        dispatch(fetchStudents());        // 异步 Action
      };
      // 表单 UI...
    };
    

三、最佳实践:路由与状态联动

场景:删除学生后自动刷新列表

  1. 组件中派发删除 Action
  2. 在 Redux 中处理删除逻辑
  3. 通过 useEffect 监听状态变化并跳转
const StudentDetail = ({ id }) => {
  const dispatch = useDispatch();
  const navigate = useNavigate();
  
  const handleDelete = () => {
    dispatch(deleteStudent(id)).then(() => {
      navigate('/students'); // 删除后返回列表页
    });
  };
};

四、总结与资源

  • 技术栈亮点

    • React Router v6:嵌套路由、动态路径、编程导航一气呵成
    • Redux Toolkit:模块化状态管理 + 异步处理开箱即用
  • 进一步学习


“让复杂的技术简单化,让抽象的概念具象化”  —— 如果本文帮你打通了 React 开发的任督二脉,欢迎点赞收藏🌟,你的支持是我持续创作的最大动力!