react + redux 状态管理操纵

[复制链接]
发表于 2026-2-22 05:26:36 | 显示全部楼层 |阅读模式
1 概念

Redux 是一个全局状态管理的 JS 库

2 Redux 安装

在react中利用redux,官方要求安装两个其他插件:Redux Toolkit 和 react-redux


  • Redux Toolkit:官方保举编写redux逻辑的方式,简化誊写方式
  • react-redux:用来毗连 redux 和 react 组件的中央件
通过下令:
  1. npm i @reduxjs/toolkit react-redux
复制代码
3 创建子模块并导入

创建如下目次结构

counterStore.js 代码如下:
  1. import { createSlice } from "@reduxjs/toolkit";
  2. const counterStore = createSlice({
  3.     name: 'counter',
  4.     // 初始化state
  5.     initialState: {
  6.         count: 0
  7.     },
  8.     // 修改状态的方法 (同步方法)
  9.     reducers: {
  10.         increment(state) {
  11.             state.count++
  12.         },
  13.         decrement(state) {
  14.             state.count--
  15.         }
  16.     }
  17. })
  18. // 解构出来action函数
  19. const { increment, decrement } = counterStore.actions
  20. // 获取reducer
  21. const reducer = counterStore.reducer
  22. // 导出actions
  23. export { increment, decrement }
  24. // 默认导出reducer
  25. export default reducer
复制代码
此中,我们界说了数据:count
以及两个 action:increment / decrement,后续会通过 dispatch 来触发 action 修改数据
   react 只有一种方式可以或许修改数据,就是 action,我们须要用 dispatch 提交 action,来修改数据
  然后再将子模块 counterStore.js 引入
index.js 代码如下:
  1. import { configureStore } from '@reduxjs/toolkit'
  2. import counter from './modules/counterStore'
  3. // 导入子模块reducer
  4. export default configureStore({
  5.   reducer: {
  6.     counter
  7.   }
  8. })
复制代码
4 中央件为 react 注入 store

react-redux 负责把 react 和 redux 毗连起来,内置 Provider 组件 通过 store 参数把创建好的 store 实例注入到应用中,毗连正式创建
通过导入 store 和 Provider 后
利用 Provider 将 App 包裹起来
  1. import store from "./store";
  2. import { Provider } from "react-redux";
  3. const root = ReactDOM.createRoot(document.getElementById('root'));
  4. root.render(
  5.   <React.StrictMode>
  6.     <Provider store={store}>
  7.       <App />
  8.     </Provider>
  9.   </React.StrictMode>
  10. );
复制代码
5 在组件中利用 store 数据

须要用到一个钩子函数 useSelector(),他的作用是把 store 的数据映射到组件中
  1. import './App.css';
  2. import { useSelector } from "react-redux";
  3. function App() {
  4.   // 获得 count 数据
  5.   const { count } = useSelector(state => state.counter)
  6.   return (
  7.     <div className="App">
  8.       {count}
  9.     </div>
  10.   );
  11. }
  12. export default App;
复制代码
利用 {count} 语法,界面中会展示 count 初始值
6 修改 store 数据

须要别的一个 hook 函数 userDispatch,它的作用是天生提交 action 对象的 dispatch 函数

   react 只有一种方式可以或许修改数据,就是 action,我们须要用 dispatch 提交 action,来修改数据
  1. import './App.css';
  2. import { useDispatch, useSelector } from "react-redux";
  3. // 导入action
  4. import { increment, decrement } from './store/modules/counterStore.js'
  5. function App() {
  6.   // 获得 count 数据
  7.   const { count } = useSelector(state => state.counter)
  8.   // 通过 dispatch 提交action 修改数据
  9.   const dispatch = useDispatch()
  10.   return (
  11.     <div className="App">
  12.       <button onClick={() => dispatch(decrement())}>-</button>
  13.       {count}
  14.       <button onClick={() => dispatch(increment())}>+</button>
  15.     </div>
  16.   );
  17. }
  18. export default App;
复制代码
7 提交 action 传参

在调用 action 时,参数会被通报到 action 对象的 payload 属性上


  1. import './App.css';
  2. import { useDispatch, useSelector } from "react-redux";
  3. // 导入action
  4. import { increment, decrement, addToNum } from './store/modules/counterStore.js'
  5. function App() {
  6.   // 获得 count 数据
  7.   const { count } = useSelector(state => state.counter)
  8.   // dispatch 提交action 修改数据
  9.   const dispatch = useDispatch()
  10.   return (
  11.     <div className="App">
  12.       <button onClick={() => dispatch(decrement())}>-</button>
  13.       {count}
  14.       <button onClick={() => dispatch(increment())}>+</button>
  15.       <button onClick={() => dispatch(addToNum(10))}>+10</button>
  16.     </div>
  17.   );
  18. }
  19. export default App;
复制代码
  1. import { createSlice } from "@reduxjs/toolkit";
  2. const counterStore = createSlice({
  3.     name: 'counter',
  4.     // 初始化state
  5.     initialState: {
  6.         count: 0
  7.     },
  8.     // 修改状态的方法 (同步方法)
  9.     reducers: {
  10.         increment(state) {
  11.             state.count++
  12.         },
  13.         decrement(state) {
  14.             state.count--
  15.         },
  16.         addToNum(state, action) {
  17.             state.count += action.payload
  18.         }
  19.     }
  20. })
  21. // 解构出来action函数
  22. const { increment, decrement, addToNum } = counterStore.actions
  23. // 获取reducer
  24. const reducer = counterStore.reducer
  25. // 导出actions
  26. export { increment, decrement, addToNum }
  27. // 默认导出reducer
  28. export default reducer
复制代码
8 异步状态操纵



  • 创建 store 的 state 和 action 稳固
  • 在子模块中单独封装一个函数,新函数中异步哀求拿到数据,并利用 dispatch 触发 action

    创建新的 store 模块
    store/modules/channelStore.js 代码如下:
  1. import { createSlice } from "@reduxjs/toolkit";
  2. const channelStore = createSlice({
  3.     name: 'channel',
  4.     // 初始化state
  5.     initialState: {
  6.         channel: [{id: 50}, {id: 100}]
  7.     },
  8.     // 修改状态的方法 (同步方法)
  9.     reducers: {
  10.         setChannels(state, action) {
  11.             state.channel = action.payload
  12.         }
  13.     }
  14. })
  15. // 解构出来action函数
  16. const { setChannels } = channelStore.actions
  17. // 获取reducer
  18. const reducer = channelStore.reducer
  19. // 异步请求
  20. const fetchChannList = () => {
  21.     return async (dispatch) => {
  22.         setTimeout(() => {
  23.             dispatch(setChannels([{id: 50}, {id: 100}, {id: 150}, {id: 200}]))
  24.         })  // 模拟产生异步请求
  25.         console.log('aaa')
  26.     }
  27. }
  28. // 导出异步方法
  29. export { fetchChannList }
  30. // 默认导出reducer
  31. export default reducer
复制代码
App.js 代码如下:
  1. import './App.css';
  2. import { useEffect } from 'react';
  3. import { useDispatch, useSelector } from "react-redux";
  4. // 导入action
  5. import { increment, decrement, addToNum } from './store/modules/counterStore.js'
  6. import { fetchChannList } from './store/modules/channelStore.js'
  7. function App() {
  8.   // 获得 state 数据
  9.   const { count } = useSelector(state => state.counter)
  10.   const { channel } = useSelector(state => state.channel)
  11.   // dispatch 提交action 修改数据
  12.   const dispatch = useDispatch()
  13.   // 使用useEffect触发异步请求
  14.   useEffect(() => {
  15.     dispatch(fetchChannList())
  16.   }, [dispatch])
  17.   return (
  18.     <div className="App">
  19.       <button onClick={() => dispatch(decrement())}>-</button>
  20.       {count}
  21.       <button onClick={() => dispatch(increment())}>+</button>
  22.       <button onClick={() => dispatch(addToNum(10))}>+10</button>
  23.       <ul>
  24.         {channel.map(item => <li key={item.id}>{item.id}</li>)}
  25.       </ul>
  26.     </div>
  27.   );
  28. }
  29. export default App;
复制代码
9 redux 调试工具

谷歌下载:redux devtools

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表