对Redux中间件的理解?常用的中间件有哪些?实现原理?

2023-11-15

一、是什么

中间件(Middleware)是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享、功能共享的目的 

二、常用的中间件

有很多redux中间件,如:

  • redux-thunk:用于异步操作
  • redux-logger:用于日志记录

上述的中间件都需要通过applyMiddlewares进行注册,

作用是将所有的中间件组成一个数组,依次执行

然后作为第二个参数传入到createStore

const store = createStore(
  reducer,
  applyMiddleware(thunk, logger)
);

redux-thunk

redux-thunk是官网推荐的异步处理中间件

默认情况下的dispatch(action)action需要是一个JavaScript的对象

redux-thunk中间件会判断你当前传进来的数据类型,如果是一个函数,将会给函数传入参数值(dispatch,getState)

  • dispatch函数用于我们之后再次派发action
  • getState函数考虑到我们之后的一些操作需要依赖原来的状态,用于让我们可以获取之前的一些状态

所以dispatch可以写成下述函数的形式:

const getHomeMultidataAction = () => {
  return (dispatch) => {
    axios.get("http://xxx.xx.xx.xx/test").then(res => {
      const data = res.data.data;
      dispatch(changeBannersAction(data.banner.list));
      dispatch(changeRecommendsAction(data.recommend.list));
    })
  }
}

 

redux-logger

如果想要实现一个日志功能,则可以使用现成的redux-logger

import { applyMiddleware, createStore } from 'redux';
import createLogger from 'redux-logger';
const logger = createLogger();

const store = createStore(
  reducer,
  applyMiddleware(logger)
);

三、实现原理

首先看看applyMiddlewares的源码

export default function applyMiddleware(...middlewares) {
  return (createStore) => (reducer, preloadedState, enhancer) => {
    var store = createStore(reducer, preloadedState, enhancer);
    var dispatch = store.dispatch;
    var chain = [];

    var middlewareAPI = {
      getState: store.getState,
      dispatch: (action) => dispatch(action)
    };
    chain = middlewares.map(middleware => middleware(middlewareAPI));
    dispatch = compose(...chain)(store.dispatch);

    return {...store, dispatch}
  }
}

所有中间件被放进了一个数组chain,然后嵌套执行,最后执行store.dispatch。可以看到,中间件内部(middlewareAPI)可以拿到getStatedispatch这两个方法

在上面的学习中,我们了解到了redux-thunk的基本使用

内部会将dispatch进行一个判断,然后执行对应操作,原理如下:

function patchThunk(store) {
    let next = store.dispatch;

    function dispatchAndThunk(action) {
        if (typeof action === "function") {
            action(store.dispatch, store.getState);
        } else {
            next(action);
        }
    }

    store.dispatch = dispatchAndThunk;
}

实现一个日志输出的原理也非常简单,如下:

let next = store.dispatch;

function dispatchAndLog(action) {
  console.log("dispatching:", addAction(10));
  next(addAction(5));
  console.log("新的state:", store.getState());
}

store.dispatch = dispatchAndLog;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对Redux中间件的理解?常用的中间件有哪些?实现原理? 的相关文章

  • 线上系统性能太差,我手写了字符串切割函数,性能提升10倍以上

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 工作中常用的 split 切割字符串效率高吗 JDK 提供字符串切割工具类 StringTokenizer 手把手带你实现一个更高效的字符串切割工具类 总结 今
  • 分布式 dataX 详细 (落地) 设计

    1 背景 分布式 DataX 基于 datax 打造的语义分分布式 ETL 平台 Datax 提供 reader framework writer 框架 方便开发两种异构数据源数据同步 但开源的 datax 缺少分布式特性 本文介绍基于 e
  • Ionic3开发教程 - 开发(2)

    Ionic3开发系列教程Ionic3开发教程 环境准备 1 Ionic3开发教程 开发 2 Ionic3开发教程 发布Android版本 3 Ionic3开发教程 发布IOS版本 4 Ionic3开发教程 更新 5 本文中介绍的Ionic3
  • Ant Design Pro 从零到一教程

    说在最前面的话 可是能全网唯一适合小白的antd教程 因为我找了接近一个周的教程 无论是视频 博客等等都没有比较完整的教程 所以才说这可能是唯一全网适合小白教程 文章末有相关学习链接 适用人群 喜欢看文字或者代码学习的人 学习的人掌握基本的
  • React中使用if else 条件判断

    在react中用jsx渲染dom的时候经常会遇到if条件判断 然而在jsx中竟是不允许if条件判断的 以下有几种判断方式 可以根据自己的应用场景 挑选适合的 方案一 class HelloMessage extends React Comp
  • Django

    HTTP无状态协议 是指协议对于交互性场景没有记忆能力 每次客户端检索网页时 客户端打开一个单独的连接到 Web 服务器 服务器会自动不保留之前客户端请求的任何记录 创建用户对象的三种方法 create 创建一个普通用户 密码是明文的 cr
  • Ant Design Pro从零到一(认识AntD)

    废话 在我们第一次接触AntD的时候 会遇到两个东西 一个是Ant Design 另一个是Ant Design Pro 他们的官网分别是 Ant Design 一套企业级 UI 设计语言和 React 组件库 Ant Design Pro
  • ESB开发WebService接口

    1 概述 在进行系统间集成时经常利用WebService 但是从建立WebService和调用的重复性和维护性的工作量都相当大 首先简单介绍一下 ESB全称为Enterprise Service Bus 即企业服务总线 它是传统中间件技术与
  • kafka系列——KafkaProducer源码分析

    实例化过程 在KafkaProducer的构造方法中 根据配置项主要完成以下对象或数据结构的实例化 配置项中解析出 clientId 用于跟踪程序运行情况 在有多个KafkProducer时 若没有配置 client id则clientId
  • 一周简报(项目尾声)

    XX海油项目已经进入尾声 大部分的工作都已经完成 目前我们所做的就是完善系统中的Bug 以及面对客户提出的某些部分的需求变更 由于形式所迫 我们的战斗由 城市 转入 农村 由 地上 转入 地下 由 阵地战 转为 游击战 我们当前的任务是以客
  • React实现关键字高亮

    先看效果 实现很简单通过以下这个函数 highLight text keyword gt return text split keyword flatMap str gt span keyword span str slice 1 展示某段
  • umi 后台管理demo

    umi 后台管理demo umi react ts dva antd egg 有待优化 简单的前后端管理demo 接口提供增删查改 前端也有相应功能 github代码 https github com huiBuiling ql admin
  • JAVA WEB 中间件为SERVLET(四)

    写一个用户登录部署到tomcat 本地 先找到一个模板 HTML代码复制到本地的项目index jsp中 这个登录模板包含一个JSP 一个JS 三个CSS等文件 这个是index jsp代码
  • 【React】 4课 react初识组件

    首先我们如1课创建一个文件夹在文件夹中安装react环境需要的配置文件 npm init y npm i babel standalone D npm i react react dom D 安装配置文件教程链接 https blog cs
  • 两点。。。等来金蝶中间件的面试通知

    晚上笔试 说是大约一点通知 等到十二点 困了 上床 睡不着啊 1点半翻起来 打开手机 没有 打开Gmail 没有 于是抽了支烟 等到两点多一点 手机响了 接到面试通知 下午一点 石头终于落地 因为上午还有一场网易游戏的笔试 担心冲突 还好
  • 消息队列选型:Kafka 如何实现高性能?

    在分布式消息模块中 我将对消息队列中应用最广泛的 Kafka 和 RocketMQ 进行梳理 以便于你在应用中可以更好地进行消息队列选型 另外 这两款消息队列也是面试的高频考点 所以 本文我们就一起来看一下 Kafka 是如何实现高性能的
  • 高可用:如何实现消息队列的 HA?

    管理学上有一个木桶理论 一只水桶能装多少水取决于它最短的那块木板 这个理论推广到分布式系统的可用性上 就是系统整体的可用性取决于系统中最容易出现故障 或者性能最低的组件 系统中的各个组件都要进行高可用设计 防止单点故障 消息队列也不例外 本
  • 消息队列选型:Kafka 如何实现高性能?

    在分布式消息模块中 我将对消息队列中应用最广泛的 Kafka 和 RocketMQ 进行梳理 以便于你在应用中可以更好地进行消息队列选型 另外 这两款消息队列也是面试的高频考点 所以 本文我们就一起来看一下 Kafka 是如何实现高性能的
  • 如何提高React组件的渲染效率的?在React中如何避免不必要的render?

    面试官 说说你是如何提高组件的渲染效率的 在React中如何避免不必要的render 一 是什么 react 基于虚拟 DOM 和高效 Diff 算法的完美配合 实现了对 DOM 最小粒度的更新 大多数情况下 React 对 DOM 的渲染
  • 如何将支持标准可观测性协议的中间件快速接入观测

    前言 作为一名云原生工程师 如何将支持标准可观测性协议的中间件快速接入观测云呢 答案是只需要三步 首先 需要确定您要观测的中间件类型 支持标准可观测性协议中间件可通过观测云的 DataKit 采集到中间件的关键指标 有些中间件自带可观测 会

随机推荐

  • Python---猜拳游戏石头剪刀布

    从控制台输入要出的拳 石头 1 剪刀 2 布 3 电脑 随机 出拳 先假定电脑只会出石头 完成整体代码功能 比较胜负 1 石头 2 剪刀 3 布 import random computer random randint 1 3 playe
  • 【flutter上传图片】

    1 使用multi image picker插件 选择图片 openPhotoSelect int maxImages context async try List
  • STM32外设系列—红外遥控

    文章目录 一 红外遥控简介 二 红外遥控的原理 三 二进制脉冲编码 3 1 NEC码的位定义 3 2 NEC遥控指令的数据格式 四 红外遥控程序设计思路 五 红外遥控程序设计 5 1 红外遥控初始化程序 5 2 记录高电平持续时间函数 5
  • php爬虫教程(二)数据请求分析

    可以看到这个请求返回的就是整个页面的html 如果我们需要这里的某一个数据就可以通过正则匹配的方式匹配出来
  • Pytorch环境配置|m1 |macbookpro

    参考github上大大们的回答 链接在此 如果我有些不详细的点请自行查阅 菜鸟一枚 如果遇到问题可留言讨论 一起探索 有些复杂问题我也不会 见谅 1 安装miniforge3 我是直接下载的标红的 2 进入终端 command 空格 焦点搜
  • jQuery获取链接参数

    公司前端页面 之前公司前端竟然是用split函数分割链接来获取参数 真的无语了 这完全是没理解链接是干嘛的呀 搜了一个用正则匹配获取参数的方法 上代码 获取url中的参数 function getUrlParam name var reg
  • 使用代理重加密+PlatONE,来保证数据可信、安全地共享

    在制造 医药等行业中 有着大量沉睡的数据 利用这些数据 将有潜力推动技术创新或解密生命科学 但同时 这些数据中涉及商业机密和用户隐私保护 在不可信环境下实现安全的数据共享一直是一个难题 传统中心化方案存在数据容易被泄露 数据容易被篡改 数据
  • 1] python 爬取微信好友个性签名,生成词云

    在Anaconda下完成 参考https blog csdn net zhonglixianyun article details 78229782 结果图 1 需要的库 numpy os itchat wordcloud jieba 1
  • VRRP协议的作用

    文章目录 一 VRRP概述 1 1 VRRP概述 1 2 应用 1 3VRP工作原理 1 4选举依据 二 VRRP术语 2 1虚拟路由器 三 虚拟MAC地址 3 1虚拟MAC地址 3 2选举出master back
  • react+ts+vite+router6+antd 保姆级搭建

    一 项目搭建 采用vite方式 根据选择 react ts pnpm create vite 1 1 修改初始结构 删除多余文件 1 2 修改vite config配置文件 配置别名 vite config import defineCon
  • 大学生最好用搜题的APP,个人开发的,吊打一切搜题软件

    吊打市面大学搜题app 不好用直接举报我 谢谢 软件名称 火星搜题 软件版本 1 2 软件大小 2 5m 使用平台 安卓 是否root 免root 测试机型 小米11 软件说明 是市面让你感到体验的免费搜题软件 3000w道题库搜索 大学的
  • 消息耦合还是接口耦合

    最近公司准备开发一个新产品 需要重新设计一套新的框架 但是就这框架中各模块的通信方式 大家产生了争论 主要集中在各模块的交互方式是消息耦合还是接口耦合 需求大概这样 我们需要封装一套客户端SDK 暴露一系列API给外部用 而这套SDK内部会
  • Java基础知识查阅表(三)[各种API、反射、文件类、集合接口、范型、IO流、类加载]

    文章目录 String类 String的方法 StringBuffer类 StringBuffer的方法 为什么StringBuffer比String拼接快 StringBuilder类 Scanner类 Scanner类的方法 Array
  • MySQL每个用户只对自己的记录有select权限(超详细)

    MySQL每个用户只对自己的记录有select权限 原题再现 1 运行环境 2 创建习题中涉及到的用户 3 创建测试所需的数据库和表 4 向职工表中插入测试数据 5 创建视图 这里划重点 6 将视图的select权限授予给每个用户 7 权限
  • 毕业设计-基于机器视觉的电线颜色识别系统软件- OpenCV

    目录 前言 课题背景和意义 实现技术思路 一 图像预处理 三 电线颜色特征提取方法的研究 四 基于 神经网络的颜色识别算法实现 实现效果图样例 最 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边
  • 关于芯片功耗的那些事(十九)

    续前一期 聊聊EM 的问题 当工艺在110nm及以下 由于metal 的最小线宽越来越窄 加之更高的device 电流和on die 的温度越来高 互连线的可靠性问题 互连线的EM问题越来越引起重视 电迁移的问题 可能导致金属线的要么变窄
  • 阿里天池—2022江苏气象预测AI算法挑战赛

    文章目录 摘要 一 数据分析 二 MAE简介 三 Transformer简介 四 模型搭建 还未写 摘要 This is a meteorological forecasting competition being held by Ali
  • 超融合服务器品牌型号,蓝盾发布云平台!强势加入云计算IT行列

    近年来 云计算逐渐与各行各业深度融合 带来诸多颠覆式创新 凸显出巨大的应用价值和发展前景 蓝盾股份作为信息安全行业领军企业 强势发布蓝盾云平台 成为云计算技术领域不容忽视的推动力量 一 产品简介 蓝盾云平台是满足国家等保规范 CSA云计算关
  • golang http请求如何设置代理

    go访问google的一些api的时候可能访问不到 可以给http设置走代理 u url Parse htttp 127 0 0 1 7890 t http Transport MaxIdleConns 10 MaxConnsPerHost
  • 对Redux中间件的理解?常用的中间件有哪些?实现原理?

    一 是什么 中间件 Middleware 是介于应用系统和系统软件之间的一类软件 它使用系统软件所提供的基础服务 功能 衔接网络上应用系统的各个部分或不同的应用 能够达到资源共享 功能共享的目的 二 常用的中间件 有很多redux中间件 如