Redux状态管理用法详解
创作时间:
作者:
@小白创作中心
Redux状态管理用法详解
引用
CSDN
1.
https://blog.csdn.net/qq_30193097/article/details/139330042
Redux是React中常用的状态管理库,Redux Toolkit和react-redux是其官方推荐的工具包。本文将通过目录结构、代码示例等方式,系统地讲解如何创建和使用store、如何在组件中使用store中的数据,以及如何处理异步状态操作。
在React中使用redux,官方要求安装俩个其他插件 - Redux Toolkit 和 react-redux
1.ReduxToolkit (RTK) 官方推荐编写 Redux 逻辑的方式,是一套工具的集合集,简化书写方式
简化 store 的配置方式;
内置 immer 支持可变式状态修改;
内置 thunk 更好的异步创建;
2.react-redux 用来链接 Redux 和 React 组件的中间件
目录结构:
1.通常集中状态管理的部分都会单独创建一个单独的 store 目录
2.应用通常会有很多个子 store 模块,所以创建一个 modules 目录,在内部编写业务分类的子store
3.store 中的入口文件 index,js 的作用是组合modules中所有的子模块,并导出 store
子模块 store1 中的代码如下:
import {createSlice} from "@reduxjs/toolkit"
const store1=createSlice({
name:'store1', // 模块名
// 初始化状态
initialState:{
count:0
},
// 存放修改状态的同步方法(支持直接修改)
reducers:{
add(state){
state.count++
},
sub(state){
state.count--
},
addToNum(state,action){
state.count=action.payload
}
}
})
// 结构出来actionCreater函数
const {add,sub,addToNum}=store1.actions
// 获取reducer
const store1Reducer=store1.reducer
export {add,sub,addToNum} // 按需导出actionCreater函数
export default store1Reducer // 默认导出reducer
入口文件 index.js 中的代码如下:
import {configureStore} from '@reduxjs/toolkit'
// 导入模块
import store1Reducer from './modules/store1'
// 创建根 store
const store=configureStore({
reducer:{
store1Reducer
}
})
export default store
在 index.js 文件中注入 store:
react-redux 负责把 Redux 和 React 链接 起来,内置 Provider组件 通过 store 参数把创建好的 store 实例注入到应用中链接正式建立
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import store from './store'
import {Provider} from 'react-redux'
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>
);
reportWebVitals();
在 react 组件 app.js 中使用 store:
- 在 React 组件中使用 store 中的数据,需要用到一个钩子函数 ueSelector,它的作用是把 store 中的数据映射到组件中
- React 组件中修改 store 中的数据需要借助另外一个 hook 函数- useDispatch,它的作用是生成提交 action 对象的 dispatch 函数
- 在 reducers 的同步修改方法中添加 action 对象参数,在调用 actionCreater 的时候传递参数,参数会被传递到 action 对象 payload 属性上
使用样例如下:
import './App.css';
import {useSelector,useDispatch} from 'react-redux'
import {add,sub,addToNum} from './store/modules/store1'
function App() {
const {count}=useSelector(state=>state.store1Reducer)
const dispatch=useDispatch()
return (
<div className="App">
<button onClick={()=>dispatch(add())}>+</button>
{count}
<button onClick={()=>dispatch(sub())}>-</button>
<button onClick={()=>dispatch(addToNum(10))}>add to 10</button>
<button onClick={()=>dispatch(addToNum(20))}>add to 20</button>
</div>
);
}
export default App;
异步状态操作,在 store2.js 中的代码如下:
1.创建 store 的写法保持不变,配置好同步修改状态的方法
2.单独封装一个函数,在函数内部 return 一个新函数,在新函数中
2.1封装异步请求获取数据
2.2调用同步 actionCreater 传入异步数据生成一个action对象,并使用 dispatch 提交组件中dispatch 的写法保持不变
import { createSlice } from "@reduxjs/toolkit";
import axios from 'axios'
const store2=createSlice({
name:'store2',
initialState:{
list:[]
},
reducers:{
setList(state,action){
state.list=action.payload
}
}
})
// 异步请求部分
const {setList}=store2.actions // 获取同步actionCreater方法setList
const fetchList=(url)=>{
return async (dispatch)=>{
// 调用接口获取数据
const res=await axios.get(url)
// 通过dispatch调用同步actionCreater方法setList修改状态
dispatch(setList(res.data.data.list))
}
}
// 按需导出异步actionCreater函数
export {fetchList}
const store2Reducer=store2.reducer
// 默认导出reducer
export default store2Reducer
在 react 组件 app.js 中使用store:
注:这段代码中包含前面同步修改状态的代码,方便对比
import './App.css';
import {useSelector,useDispatch} from 'react-redux'
import {add,sub,addToNum} from './store/modules/store1'
import {fetchList} from './store/modules/store2'
import { useEffect } from 'react';
function App() {
const {count}=useSelector(state=>state.store1Reducer)
const {list}=useSelector(state=>state.store2Reducer)
const dispatch=useDispatch()
// 使用 useEffect 触发异步请求
useEffect(()=>{
dispatch(fetchList('后端接口url'))
},[dispatch])
return (
<div className="App">
<button onClick={()=>dispatch(add())}>+</button>
{count}
<button onClick={()=>dispatch(sub())}>-</button>
<button onClick={()=>dispatch(addToNum(10))}>add to 10</button>
<button onClick={()=>dispatch(addToNum(20))}>add to 20</button>
<ul>
{
list.map(v=><li key={v.id}>{v.name}</li>)
}
</ul>
</div>
);
}
export default App;
热门推荐
“数字+文旅”赋能城市旅游空间沉浸更新
中国男性卧推实力表,看看你属于哪个梯队?
公版显卡和非公版显卡的区别
红薯干的功效与作用
APP开发必备指南:如何选择最适合的编程语言
40%的人,在生命中会患癌症;解决方案最重要的是这一条。。。
紧急提示灯亮起即停车,多数人忽视后果严重
智齿不拔,要付出什么代价?
50句关于人生的至理名言,句句发人深省(中英双语)
Excel格式刷功能详解:从基础到高级应用
Excel格式刷快捷键设置方法详解
六礼迎娶的意义:从传统婚俗到现代法律的演变
全面解析10类保健品的最佳服用时间:让健康效果最大化【珍藏版】
CDMO在药物和医疗器械领域的应用与发展
哪吒2票房预测与分析,探讨影响票房的因素及市场预期
雨季安全常识,这些注意事项请记牢!
没时间做雅思题怎么办?如何高效串题提高分数?
揭秘历史上的苏妲己:祸国妖姬还是亡国之君的替罪羊?
Excel中综合价格指数的三种计算方法详解
养老保险金如何转移
C语言如何实现超调量
左手中指佩戴戒指的深刻含义与文化象征解析
动物行为和生态位分配
西安水生植物
喜阴的室内水生植物有哪些(完全不用晒太阳的植物)
电脑屏幕不亮怎么办?显示器不亮但主机运行正常,这样排查
幼儿园武术操策划方案
5步轻松掌握流行UI图标设计技巧
绿色能源的应用与节约,低碳生活方式指南
干眼检查的标准是什么?了解干眼症的检测标准与方法