对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中间件的理解?常用的中间件有哪些?实现原理? 的相关文章

  • Ionic3开发教程 - 开发(2)

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

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

    创建一个react项目 首先需要打开终端 进行vite的引入 yarn create vite 使用react模板创建项目 yarn create vite react test template react cd react test y
  • 组件间样式覆盖问题--CSS Modules

    1 组件间样式覆盖问题 问题 CityList 组件的样式 会影响 Map 组件的样式 原因 在配置路由时 CityList 和 Map 组件都被导入到项目中 那么组件的样式也就被导入到项目中了 如果组件之间样式名称相同 那么一个组件中的样
  • 三、react中类组件和函数组件

    简介 本篇我们只要介绍react中类组件与函数组件两种组件的写法 两者的优缺点 同时对在我们的项目开发中该使用类组件还是函数组件进行思考分析 废话不多说进入正题 类组件 设计思路 类组件时面向对象编程的思想 在其中我们去设计类组件时使用st
  • 三分钟实现一个react-router-dom5.0的路由拦截(导航守卫)

    不同于vue 通过在路由里设置meta元字符实现路由拦截 在使用 Vue 框架提供了路由守卫功能 用来在进入某个路有前进行一些校验工作 如果校验失败 就跳转到 404 或者登陆页面 比如 Vue 中的 beforeEnter 函数 rout
  • 关于Vue.js和React.js,听听国外的开发者怎么说?

    VueJS 与 ReactJS 到底怎么样如何 听听别人怎么说 使用所有新的库和框架 很难跟上所有这些库和框架 也就是说 这就需要您决定哪些是值得花时间的 让我们看看人们说什么 和Vue JS一起工作是很愉快的 我发现学习曲线很浅 然而 这
  • Ant Design Pro从零到一(认识AntD)

    废话 在我们第一次接触AntD的时候 会遇到两个东西 一个是Ant Design 另一个是Ant Design Pro 他们的官网分别是 Ant Design 一套企业级 UI 设计语言和 React 组件库 Ant Design Pro
  • React(一):React的设计哲学 - 简单之美

    React 一 React的设计哲学 简单之美 React 二 React开发神器Webpack React 三 理解JSX和组件 React 四 虚拟DOM Diff算法解析 React 五 使用Flux搭建React应用程序架构 Rea
  • useEffect详情用法

    1 为什么要使用useEffect 想必大家都是用过vue吧 在vue框架所写的项目中 我们通过在与后端进行数据交互的过程中 通常都是会在生命周期中进行数据的请求 然后将数据返回给页面进行渲染 在React中我们也是这样 但是在函数式组件中
  • ESB开发WebService接口

    1 概述 在进行系统间集成时经常利用WebService 但是从建立WebService和调用的重复性和维护性的工作量都相当大 首先简单介绍一下 ESB全称为Enterprise Service Bus 即企业服务总线 它是传统中间件技术与
  • React核心概念:状态提升

    上一节 表单 下一节 组合vs继承 React核心概念 状态提升 引言 添加第二个输入框 编写转换函数 状态提升 经验总结 引言 很多情况下我们使用的多个组件需要对同一个数据做出对应的反应 在这里我们推荐把这个共享的状态提升到距离这些组件最
  • React、Vue2.x、Vue3.0的diff算法

    前言 本文章不讲解 vDom 实现 mount 挂载 以及 render 函数 只讨论三种 diff 算法 VNode 类型不考虑 component functional component Fragment Teleport 只考虑 E
  • react 父组件调用子组件的方法

    子组件中 const child forwardRef props ref gt useImperativeHandle ref gt 这里面的方法是暴露给父组件的 test console log 我是组件里的test方法 test2 t
  • hooks实践总结

    何为hooks 在React中hook是指不编写 class 的情况下使用 state 以及其他的 React 特性 而Vue3也推出了具有相同功能的组合式API 如果你用过Vue3就会知道在 setup 中你应该避免使用 this 因为h
  • 【React】 4课 react初识组件

    首先我们如1课创建一个文件夹在文件夹中安装react环境需要的配置文件 npm init y npm i babel standalone D npm i react react dom D 安装配置文件教程链接 https blog cs
  • error Missing “key“ prop for element in array react/jsx-key

    react遇到一个奇怪的问题 error Missing key prop for element in array react jsx key 检查了jsx中使用map的 都定义了key div otherList map item an
  • AUTOSAR从入门到精通-中间件通信DDS(三)

    目录 前言 原理 常见中间件模型 第一代 点对点CS Client Server 模型
  • 用一个简单的例子教你如何 自定义ASP.NET Core 中间件(一)

    提起中间件大家一定不陌生 我们也用过 NET core很多很好用的中间件 但是如何自己写一个中间件呢 可能大部分同学不清楚怎么写 我之前也不会 看了微软官方文档 ASP NET Core 中间件 感觉讲的也不是很清楚 下面就用一个简单的例子
  • ASP.NET Core路由中间件[1]: 终结点与URL的映射

    一 路由注册 我们演示的这个ASP NET Core应用是一个简易版的天气预报站点 如果用户希望获取某个城市在未来 N 天之内的天气信息 他可以直接利用浏览器发送一个GET请求并将对应城市 采用电话区号表示 和天数设置在URL中 如下图所示

随机推荐

  • 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中间件 如