前言
在 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> ); - 特点:基于 History API,URL 无
-
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. 在组件中使用状态
-
读取状态:
useSelectorconst StudentList = () => { const students = useSelector(state => state.student.data); // 渲染逻辑... }; -
派发 Action:
useDispatchconst AddForm = () => { const dispatch = useDispatch(); const handleSubmit = () => { dispatch(addStudent(newStudent)); // 同步 Action dispatch(fetchStudents()); // 异步 Action }; // 表单 UI... };
三、最佳实践:路由与状态联动
场景:删除学生后自动刷新列表
- 组件中派发删除 Action
- 在 Redux 中处理删除逻辑
- 通过
useEffect监听状态变化并跳转
const StudentDetail = ({ id }) => {
const dispatch = useDispatch();
const navigate = useNavigate();
const handleDelete = () => {
dispatch(deleteStudent(id)).then(() => {
navigate('/students'); // 删除后返回列表页
});
};
};
四、总结与资源
-
技术栈亮点
- React Router v6:嵌套路由、动态路径、编程导航一气呵成
- Redux Toolkit:模块化状态管理 + 异步处理开箱即用
-
进一步学习
- 官方文档:React Router | Redux Toolkit
“让复杂的技术简单化,让抽象的概念具象化” —— 如果本文帮你打通了 React 开发的任督二脉,欢迎点赞收藏🌟,你的支持是我持续创作的最大动力!