React状态管理:react-redux和redux-saga(适合由vue转到react的同学)

devtools/2024/9/22 16:52:05/

注意:本文不会把所有知识点都写一遍,并不适合纯新手阅读

首先Redux是一种状态管理方案,本身和react并没有什么联系,redux也可以结合其他框架来用。
react-redux是基于react的一种状态管理实现,他不像vuex那样直接内置在create-react-app里,需要自己去安装。

react-redux有三个重要概念,分别是:store,action,reducer。
1.store。store就是存储全局数据状态的仓库。像这样:

const initState = {xxx1: null,xxx2: null,
};

需要注意的是,state是只读的,意味着我们不能initState.xxx1 = "233"这样去修改store里的数据。
其实,工作的项目里,仓库并不是放在store.js里,store.js里一般是做一些创建store,注册saga的操作,state一般是放在具体模块的reducer.js里(一个模块应该有action.js,reducer.js,saga.js三个文件)

2.action。
上文说了,state是只读的,所以我们只能通过派发action的方式修改store里的数据。
派发action这个说法我一直觉得很拗口,其实就是dispatch action的直译。
action包含两部分:type和payload。
type其实就是action的标识,一个常量的字符串,用来说明这个action是干嘛的,比如说type:"GET_USERNAME",说明这个action是用来获取username的,payload就是参数了,就是调用api需要的参数。
注意:action是派发给store的。

3.reducer。
reducer接收一个state和action,返回一个state。
store在接收到action之后会把action和当前的state传给reducer,然后reducer根据action的type去判断执行什么样的操作,然后返回一个新的state给store,比如:return {...state,name:"接口获取到的username"}

工作流程图如下:

react-redux.png

这个流程还是蛮好懂的,接下来我们来说下reducer要注意的地方。(这里牵扯到我们为什么还要用redux-saga)
reducer必须是一个纯函数
纯函数是指一个函数的返回结果只依赖于该函数传入的参数,而不能产生副作用
副作用是指异步操作,DOM操作等...
好的,没明白是吧,说人话,reducer里是不能进行异步请求的!我们在工作中肯定会调用接口异步获取数据的,这样的话只靠react-redux是无法满足我们的需求的,而redux-saga就是来解决这个问题的。
如果你熟悉vuex,就知道vuex里有mutation和action,其中mutation提交更新数据的方法,只能是同步的,而action中就可以包含异步操作了,而且action提交的是mutation。
mutation和action的关系就近似于reducer和saga的关系:saga里调用接口获取到数据之后再提交action给reducer,最终返回新的state给store的还是reducer。

saga包含watch-saga函数和worker-saga函数,watch-saga用于监听系统派发出来的action,watch-saga一旦监听到了某个action就执行对应的worker-saga,worker-saga里进行异步操作(调用接口请求数据等),拿到数据之后派发第二个action给store,store再把state和action给reducer(至此就和无saga时的流程一样了)。
加入了saga,工作流程发生了变化:
我们注意到工作流中的action有两个,可以理解为第一个action是给watch-saga的,第二个action时异步操作完之后worker-saga给store的。

加入saga后的工作流程如下:

redux-saga.png


喜欢的朋友记得点赞、收藏、关注哦!!!


http://www.ppmy.cn/devtools/96303.html

相关文章

WO Mic 手机变身免费麦克风

目录 一、主要特点 1.支持多种连接方式 2.应用广泛 3.低延迟 4.简易配置 5.自动连接 6.音频格式 二、软件下载 三、软件安装 四、系统连接 五、测试 直播的时候,上课的时候,会议的时候……突然发现没有麦克风或者电脑麦克风有故障,这可怎么办呢?今天给大家介绍一…

计算机毕业设计选题推荐-医院问诊系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

深兰科技创始人陈海波入选“2024先锋科创家?硬科技商业先锋榜”

8月14日,2024先锋科创家系列榜单揭晓,深兰科技创始人、董事长陈海波先生凭借创新精神和商业洞察力成功入选,荣登“2024先锋科创家•硬科技商业先锋榜”。 该榜单评选由财联社《科创板日报》联合上海科学技术情报研究所(ISTIS)共同发起&#x…

milvus helm k8s开启监控

https://milvus.io/docs/monitor.md 文章写的很清晰 ,我这边做一下个人补充,初版可能只是配置,具体的grafana 监控报表后期补一下。 架构如下: values.yaml 配置 enabled: true 改为true metrics:enabled: trueserviceMonitor:…

解决使用uniapp时,uni.switchTab跳转标签页面不刷新的问题

我们在使用uni.switchTab跳转到标签页面时,并不会触发这个标签页面的onLoad方法。这是因为在 uni-app中,uni.switchTab用于跳转到指定的标签(tab)页面。由于标签页面是单实例的,即无论何时切换到该标签页面&#xff0c…

Elasticsearch、Easy-es 快速入门 SearchAfterPage分页 若依前后端分离 Ruoyi-Vue SpringBoot

一、环境安装 Elasticsearch ik分词器 1.1 下载解压Elasticsearch-7.x版本,越高越好,低版本有Log4j漏洞,Easy-es目前支持7.x 1.2 IK中文分词器 将对应Elasticsearch版本IK放进文件夹,Elasticsearch-7.6.1,ik对应版…

输出Docker容器的启动命令行脚本

当Docker容器启动后,如果忘记启动参数,比如目录挂载、端口映射等,可以通过Portainer等容器管理工具查看。但是,有时希望能获取容器启动的命令行,因为需要再启动一个类似容器,怎么办呢? 有一款工…

详细介绍pytorch重要的API

文章目录 1. Tensor(张量)创建 Tensor操作 Tensor 2. Autograd(自动求导)3. nn.Module(神经网络模块)4. Optimizer(优化器)5. Loss Function(损失函数)6. Dat…