redux中间件理解,常见的中间件,实现原理。
文章目录
- 一、Redux中间件介绍
- 1、什么是Redux中间件
- 2、使用redux中间件
一、Redux中间件介绍
1、什么是Redux中间件
redux 提供了类似后端 Express 的中间件概念,本质的目的是提供第三方插件的模式,自定义拦截 action -> reducer 的过程。变为 action -> middlewares -> reducer 。这种机制可以让我们改变数据流,实现如异步 action ,action 过滤,日志输出,异常报告等功能。
通俗来说,redux中间件就是对dispatch的功能做了扩展。
先来看一下传统的redux执行流程:
2、使用redux中间件
(1) redux-thunk(redux异步管理中间件):thunk是一个很常用的redux中间件,应用它之后,我们可以dispatch一个方法,而不仅限于一个纯的action对象。
实现原理:
- 创建一个thunk中间件函数,它接受store作为参数,并返回一个函数,即thunk函数。
- 在Redux中间件链中使用thunk中间件函数。
- 当dispatch一个action时,Redux会检查action的类型是不是函数。如果是函数,则调用该函数,并将store的dispatch和getState方法作为参数传入。
- 在thunk函数中,可以执行异步操作,例如发起网络请求或者定时器操作。
- 异步操作完成后,可以调用store的dispatch方法来分发一个新的action,或者调用store的getState方法来获取当前的状态。
- Redux会将新的action传递给其他中间件或者reducer进行处理。
(2) redux-promise(redux异步管理中间件): Promise 则更适合于输入输出操作,比较fetch函数返回的结果就是一个Promise对象,
它的实现原理如下:
- 创建一个中间件函数,接收store作为参数。
- 返回一个新的函数,接收next作为参数。
- 返回一个新的函数,接收action作为参数。
- 判断action的类型,如果action的payload是一个Promise对象,则等待Promise对象的结果,并将结果作为新的payload派发一个新的action。
- 将新的action传递给next函数,继续执行后续的中间件或者Redux的dispatch函数。
- 如果action的payload不是一个Promise对象,则直接将action传递给next函数。
(3) redux-saga(redux异步管理中间件):redux-saga是一个管理redux应用异步操作的中间件,用于代替 redux-thunk 的。
redux-saga的实现原理如下:
- 创建saga middleware:通过调用redux-saga提供的createSagaMiddleware函数创建一个saga middleware。
- 启动saga middleware:在应用程序的主入口文件中,通过调用sagaMiddleware.run(rootSaga)启动saga middleware。rootSaga是一个Generator函数,它包含了所有的saga逻辑。
- 监听action:saga middleware会通过redux的store.dispatch方法来接收action。当一个action被dispatch时,saga middleware会检查是否有与该action相关的saga逻辑。
- 执行saga逻辑:当一个与action相关的saga逻辑被触发时,saga middleware会创建一个新的Generator实例来执行该saga逻辑。saga逻辑中的每一行代码都是一个yield表达式,用于控制异步操作的流程。
- 处理异步操作:当遇到一个yield表达式时,saga middleware会暂停当前的Generator实例,并执行yield表达式后面的异步操作。异步操作可以是一个Promise、一个回调函数、一个定时器等。
- 发起新的action:当异步操作完成时,saga middleware会再次通过redux的store.dispatch方法来发起一个新的action,这个新的action会被传递给reducer进行状态更新。
- 恢复Generator实例:当一个新的action被dispatch时,saga middleware会恢复之前暂停的Generator实例,并将新的action作为yield表达式的返回值。Generator实例会继续执行,直到遇到下一个yield表达式。
- 监听取消action:saga middleware还可以监听取消action,当一个取消action被dispatch时,saga middleware会取消正在执行的Generator实例,并清理相关的资源。
相关文章:

redux中间件理解,常见的中间件,实现原理。
文章目录 一、Redux中间件介绍1、什么是Redux中间件2、使用redux中间件 一、Redux中间件介绍 1、什么是Redux中间件 redux 提供了类似后端 Express 的中间件概念,本质的目的是提供第三方插件的模式,自定义拦截 action -> reducer 的过程。变为 actio…...

麒麟系统上安装 MySQL 8.0.24
我介绍一下在麒麟系统上安装 MySQL 8.0.24 的详细步骤,前提是您已经下载了 mysql-8.0.24-linux-glibc2.12-x86_64.tar.xz 安装包。其实安装很简单,但是有坑,而且问题非常严重!由于麒麟系统相关文章博客较少,导致遇到了…...

vue 展开和收起
效果图 代码块 <div><span v-for"(item,index) in showHandleList" :key"item.index"><span>{{item.emailFrom}}</span></span><span v-if"this.list.length > 4" click"showAll !showAll">{…...

限制立方样条(RCS)中的P for overall和P for nonlinear的计算
最近不少人私信我,说有些SCI文章报了两个P值一个是P for overall,一个是P for nonlinear,就像下图这样,问我P for overall怎么计算。 P for overall我也不清楚是什么,有些博主说这个是总效应的P值,但是我没有找到相关出处。但是怎…...
vue3+ts引入echarts并实现自动缩放
第一种写法(不支持随页面大小变化而缩放) 统一的HTML页面 <div class"content_box" ref"barChart" id"content_box"></div>TS语法 <script setup lang"ts">import * as echarts from echar…...

Compressor For Mac强大视频编辑工具 v4.6.5中文版
Compressor for Mac是苹果公司推出的一款视频压缩工具,可以将高清视频、4K视频、甚至是8K视频压缩成适合网络传输或存储的小文件。Compressor支持多种视频格式,包括H.264、HEVC、ProRes和AVC-Intra等,用户可以根据需要选择不同的压缩格式。 …...

maven工程的目录结构
https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html maven工程的目录结构: 在maven工程的根目录下面,是pom.xml文件。此外,还有README.txt、LICENSE.txt等文本文件,便于用户能够…...
5.1 webrtc线程模型
那从今天开始呢?我们来了解一下y8 tc线程相关的内容,那在开始之前呢?我们先来看一下,我们本章都要讲解哪些知识? 那第一个呢?是线程的基础知识,这块内容呢?主要是为大家做一下回顾&a…...

【Linux网络】Cookie和session的关系
目录 一、Cookie 和 session 共同之处 二、Cookie 和 session 区别 2.1、cookie 2.2、session 三、cookie的工作原理 四、session的工作原理 一、Cookie 和 session 共同之处 Cookie 和 Session 都是用来跟踪浏览器用户身份的会话方式。 二、Cookie 和 session 区别 2.…...
android 硬编码保存mp4
目录 java imagereader编码保存 java NV21toYUV420SemiPlanar 编码保存视频用: imageReader获取nv21 代码来自博客: 【Android Camera2】彻底弄清图像数据YUV420_888转NV21问题/良心教学/避坑必读!_yuv420888转nv21_奔跑的鲁班七号的博客-CSDN博客 …...

gitlab合并分支
我的分支为 cheng 第一步: 增加新的代码 第二步:提交并推送 第三步:打开gitlab,找到对应项目 这样就成功把cheng分支合并到dev-test分支了...

手撕 `np.transpose` : 三维数组的循环转置
手撕 np.transpose : 三维数组的循环转置 手撕 np.transpose 2D 何为transpose ? 如上图: 二维的例子, 直观地理解就是沿着对角线拉平(对角关系左上右下依旧), 其他位置依次填充. 2. 2D数组中0,1 为原始参, 1,0 为转置参 - 原始参即数组的原始形态: 比如👆&#x…...

计算机竞赛 基于Django与深度学习的股票预测系统
文章目录 0 前言1 课题背景2 实现效果3 Django框架4 数据整理5 模型准备和训练6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于Django与深度学习的股票预测系统 ** 该项目较为新颖,适合作为竞赛课题方向ÿ…...

CSS 小技能(一):HTML 两个图片竖着平铺、设置图片点击、设置滚动条颜色
下面的代码没有考虑响应式的效果,如果考虑的话还需要一些代码进行处理。 【注】当时写的时候仅考虑了 webkit 内核的浏览器,如果是 IE 或者其他浏览器,请增加额外的 CSS 样式进行控制。 <!DOCTYPE html> <html> <head>&l…...

【论文阅读】CONAN:一种实用的、高精度、高效的APT实时检测系统(TDSC-2020)
CONAN:A Practical Real-Time APT Detection System With High Accuracy and Efficiency TDSC-2020 浙江大学 Xiong C, Zhu T, Dong W, et al. CONAN: A practical real-time APT detection system with high accuracy and efficiency[J]. IEEE Transactions on Dep…...

P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。在《生活大爆炸》第二季第 8 集中出现了一种石头剪刀布的升级版游戏。 升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势: 斯波克:《星际迷航》主…...

基于Android水果蔬菜果蔬到家商城系统 微信小程序uniAPP的开发与实现
果蔬到家是商家针对用户必不可少的一个部分。在商铺发展的整个过程中,果蔬到家担负着最重要的角色。为满足如今日益复杂的管理需求,各类果蔬到家程序也在不断改进。本课题所设计的springboot基于HBuilder X的果蔬到家APP,使用SpringBoot框架&…...

【Python】从入门到上头—Python基础(2)
文章目录 一.基础语法1.编码2.标识符3.保留字4.注释5.行与缩进6.多行语句7.数字(Number)类型8.字符串(String)9.空行10.等待用户输入11.同一行显示多条语句12.多个语句构成代码组13.print 输出14.import 与 from...import 二.基本数据类型1.变量和赋值2.多个变量赋值3.标准数据…...

leetcode刷题之283:移动零
问题 实现思路 首先, 将dest指向-1 位置, cur指向下标为0 的位置, 在cur遍历的过程中: 1) 遇到非零元素则与下标dest1 位置的元素交换, 2) 若遇到零元素则只继续cur遍历. 下标为1 的位置上是 非零元素 执行1) 交换得到右图结果 随后cur 得到下图结果 下标为2 的位置上是零…...
【Spring Boot】SpringBoot和数据库交互: 使用Spring Data JPA
文章目录 1. 数据库和Java应用程序1.1 为什么需要数据库交互1.2 传统的数据库交互方法 2. 什么是JPA2.1 JPA的定义2.2 JPA的优势 3. Spring Data JPA介绍3.1 Spring Data JPA的特性3.2 如何简化数据库操作 4. 在SpringBoot中集成Spring Data JPA4.1 添加依赖4.2 配置数据源 5. …...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...