当前位置: 首页 > news >正文

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

一、是什么

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

在上篇文章中,了解到了Redux整个工作流程,当action发出之后,reducer立即算出state,整个过程是一个同步的操作

那么如果需要支持异步操作,或者支持错误处理、日志监控,这个过程就可以用上中间件

Redux中,中间件就是放在就是在dispatch过程,在分发action进行拦截处理,如下图:

其本质上一个函数,对store.dispatch方法进行了改造,在发出 Action和执行 Reducer这两步之间,添加了其他功能

二、常用的中间件

有很多优秀的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)可以拿到getState和dispatch这两个方法

在上面的学习中,我们了解到了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;

参考文献

  • http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_two_async_operations.html

相关文章:

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

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

【已验证】php配置连接sql server中文乱码(解决方法)更改utf-8格式

解决数据库中的中文数据在页面显示乱码的问题 在连接的$connectionInfo中设置"CharacterSet" > "UTF-8",指定编码方式即可 $connectionInfo array("UID">$uid, "PWD">$pwd, "Database">$database…...

《未来之路:技术探索与梦想的追逐》

创作纪念日 日期:2023年07月05日文章标题:《从零开始-与大语言模型对话学技术-gradio篇(1)》成为创作者第128天 在这个平凡的一天,我撰写了自己的第一篇技术博客,题为《从零开始-与大语言模型对话学技术-…...

vue3 自动导入composition-apiI和组件

1.api的自动导入 常规写法&#xff1a; <script setup>import { ref, reactive, onMounted, computed ,watch } from vue;import { useRouter } from "vue-router";const router useRouter();const person reactive ({name&#xff1a;张三&#xff0c;age…...

LeetCode15-三数之和

本文最精华的就是下面的视频讲解! &#x1f517;:参考的视频讲解 class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> ans new ArrayList<>();Arrays.sort(nums);int nnums.length;int i0,j0,k0,sum0;for(…...

安全物理环境(设备和技术注解)

网络安全等级保护相关标准参考《GB/T 22239-2019 网络安全等级保护基本要求》和《GB/T 28448-2019 网络安全等级保护测评要求》 密码应用安全性相关标准参考《GB/T 39786-2021 信息系统密码应用基本要求》和《GM/T 0115-2021 信息系统密码应用测评要求》 1物理位置选择 1.1机房…...

箭头函数 跟匿名函数this的指向问题

var id 10; function foo() {// 创建时 this->windowthis.id 20; // 等价于 window.id 20let c () > {console.log("id1:", this.id); // 创建时父级 创建时 this->window};let d function () {console.log("id2:", this.id); // 执行时本…...

Java Stream:List分组成Map或LinkedHashMap

在Java中&#xff0c;使用Stream API可以轻松地对集合进行操作&#xff0c;包括将List转换为Map或LinkedHashMap。本篇博客将演示如何利用Java Stream实现这两种转换&#xff0c;同时假设List中的元素是User对象。 1. 数据准备 List<User> list new ArrayList<>(…...

vue2+elementui使用MessageBox 弹框$msgbox自定义VNode内容:实现radio

虽说实现下面的效果&#xff0c;用el-dialog很轻松就能搞定。但是这种简单的交互&#xff0c;我更喜欢使用MessageBox。 话不多说&#xff0c;直接上代码~ <el-button type"primary" size"mini" click"handleApply()" >处理申请</el-b…...

OC 实现手指滑动拖动View

RPReplay_Final1699613924 实现手指滑动拖动View 支持手势移动的控件 支持 Masonry frame 布局 使用富文本 也支持自动高度 核心代码 - (void)handlePanGesture:(UIPanGestureRecognizer *)p {CGPoint panPoint [p locationInView:self.view];CGPoint currentViewPoint _dr…...

多级缓存之实现多级缓存

多级缓存的实现离不开Nginx编程&#xff0c;而Nginx编程又离不开OpenResty。 1. OpenResty快速入门 我们希望达到的多级缓存架构如图&#xff1a; 其中&#xff1a; windows上的nginx用来做反向代理服务&#xff0c;将前端的查询商品的ajax请求代理到OpenResty集群 OpenRest…...

React【axios、全局处理、 antd UI库、更改主题、使用css module的情况下修改第三方库的样式、支持sass less】(十三)

文件目录 Proxying in Development http-proxy-middleware fetch_get fetch 是否成功 axios 全局处理 antd UI库 更改主题 使用css module的情况下修改第三方库的样式 支持sass & less Proxying in Development 在开发模式下&#xff0c;如果客户端所在服务器跟后…...

在gitlab中指定自定义 CI/CD 配置文件

文章目录 1. 介绍2. 配置操作3. 配置场景3.1 CI/CD 配置文件在当前项目step1&#xff1a;在当前项目中创建目录&#xff0c;编写流水线文件存放在该目录中step2&#xff1a;在当前项目中配置step3&#xff1a;运行流水线测试 3.2 CI/CD 配置文件位于外部站点上step1&#xff1a…...

(论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking

文献阅读笔记 简介 题目 Learning a Deep Compact Image Representation for Visual Tracking 作者 N Wang, DY Yeung 原文链接 Learning a Deep Compact Image Representation for Visual Tracking (neurips.cc) 关键词 Object tracking、DLT、SDAE 研究问题 track…...

浅谈设计模式

文章目录 一、单例模式 1.饿汉模式 2.懒汉模式 二、工厂模式 三、建造者模式 四、代理模式 设计模式是前辈们对代码开发的总结&#xff0c;是解决特定问题的一系列套路。它不是语法规定&#xff0c;而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解…...

企业年会/年终活动如何邀请媒体记者报道?

​媒体邀约是企业或组织进行宣传的重要手段之一。通过邀请媒体参加活动&#xff0c;可以增加活动的曝光度和知名度&#xff0c;吸引更多的关注和参与。同时&#xff0c;媒体报道还可以提高企业或组织的权威性和可信度&#xff0c;从而让公众更容易接受其传达的信息。 企业年会或…...

C语言如何执行HTTP GET请求

在现代互联网时代&#xff0c;网络数据的获取和分析变得越来越重要。无论是为了研究市场趋势&#xff0c;还是为了收集信息进行数据分析&#xff0c;编写一个网络爬虫可以帮助我们自动化这一过程。在这篇文章中&#xff0c;我们将使用C语言和libcurl库来编写一个简单的网络爬虫…...

.Net 6 Nacos日志控制台疯狂发输出+Log4Net日志过滤

我们的项目配置了Log4Net 作为日志输出工具&#xff0c;在引入Nacos后&#xff0c;控制台和日志里疯狂输出nacos心跳日志和其他相关信息&#xff0c;导致自己记录的信息被淹没了&#xff0c;找了很多解决办法&#xff1a; 1、提高nacos日志级别&#xff0c;然后再屏蔽相应级别…...

Libra R-CNN: Towards Balanced Learning for Object Detection(2019.4)

文章目录 AbstractIntroduction引入问题1&#xff09; Sample level imbalance2) Feature level imbalance3) Objective level imbalance进行解决贡献 Related Work&#xff08;他人的work&#xff0c;捎带与我们的对比&#xff09;Model architectures for object detection&a…...

Redis的内存淘汰策略分析

概念 LRU 是按访问时间排序&#xff0c;发生淘汰的时候&#xff0c;把访问时间最久的淘汰掉。LFU 是按频次排序&#xff0c;一个数据被访问过&#xff0c;把它的频次 1&#xff0c;发生淘汰的时候&#xff0c;把频次低的淘汰掉。 几种LRU策略 以下集中LRU测率网上有很多&am…...

intv_ai_mk11惊艳案例:用‘分点说明’指令生成直播复盘报告,覆盖数据/话术/节奏

intv_ai_mk11惊艳案例&#xff1a;用分点说明指令生成直播复盘报告&#xff0c;覆盖数据/话术/节奏 1. 直播复盘报告生成效果展示 直播结束后&#xff0c;运营团队最头疼的就是整理复盘报告。传统方式需要人工回看录像、统计数据、分析话术&#xff0c;耗时耗力。而使用intv_…...

从CI/CD流水线故障排查说起:当git pull显示已更新,但服务器文件纹丝不动时怎么办?

从CI/CD流水线故障排查说起&#xff1a;当git pull显示已更新&#xff0c;但服务器文件纹丝不动时怎么办&#xff1f; 在自动化部署的世界里&#xff0c;最令人抓狂的莫过于明明看到git pull输出"Already up-to-date"&#xff0c;却发现服务器上的代码纹丝未动。这种…...

嵌入式LVGL实战:手把手教你用Spinner控件打造智能设备‘呼吸感’状态提示

嵌入式LVGL实战&#xff1a;用Spinner控件设计智能设备的呼吸感状态提示 在智能咖啡机完成研磨的等待过程中&#xff0c;那个缓缓转动的弧形进度指示器&#xff0c;远比冰冷的百分比数字更能缓解用户的焦虑——这就是动态视觉反馈的魔力。作为嵌入式设备与用户对话的第一界面&a…...

从内存窥探到网络封包:实战讲解C/C++中二进制、十六进制输出的5个高频应用场景

从内存窥探到网络封包&#xff1a;实战讲解C/C中二进制、十六进制输出的5个高频应用场景 在计算机系统的底层世界里&#xff0c;数据从来不以人类熟悉的十进制形式存在。当我们调试一个崩溃的程序、分析网络数据包或配置嵌入式设备寄存器时&#xff0c;真正呈现在硬件层面的永…...

别让时钟约束拖后腿!FPGA设计中那些容易被忽略的时序约束细节:虚拟时钟、输入抖动与不确定性设置

别让时钟约束拖后腿&#xff01;FPGA设计中那些容易被忽略的时序约束细节&#xff1a;虚拟时钟、输入抖动与不确定性设置 在FPGA设计的世界里&#xff0c;时序约束就像是一把双刃剑——用得好可以让你的设计跑得又快又稳&#xff0c;用得不好则可能成为项目进度和性能的绊脚石。…...

Linux下certutil与Windows certutil傻傻分不清?一文讲透两者的区别与使用场景

Linux与Windows下的certutil&#xff1a;同名工具的全方位对比与实战指南 第一次在Linux终端输入certutil命令时&#xff0c;我下意识地按照Windows经验操作&#xff0c;结果系统提示"command not found"。这个看似简单的工具名背后&#xff0c;隐藏着两个完全不同的…...

【AGI发展里程碑】:SITS2026官方路线图深度解码——5大技术跃迁节点与3年落地时间表

第一章&#xff1a;SITS2026发布&#xff1a;AGI发展路线图 2026奇点智能技术大会(https://ml-summit.org) SITS2026正式发布了《通用人工智能发展路线图&#xff08;2026–2035&#xff09;》&#xff0c;标志着AGI研发从碎片化工程实践转向系统性科学治理。该路线图由全球4…...

Elden Ring帧率解锁与更多功能:3个步骤彻底告别60帧限制的完整指南

Elden Ring帧率解锁与更多功能&#xff1a;3个步骤彻底告别60帧限制的完整指南 【免费下载链接】EldenRingFpsUnlockAndMore A small utility to remove frame rate limit, change FOV, add widescreen support and more for Elden Ring 项目地址: https://gitcode.com/gh_mi…...

从“对话工具”到“自主智能体”:彻底搞懂AI Agent的核心定义、本质边界与落地实践

你是不是也经常听到「AI Agent」这个词&#xff0c;却始终分不清它和普通聊天机器人、加了插件的大模型到底有什么本质区别&#xff1f; 是不是见过太多号称「Agent」的产品&#xff0c;用起来却还是和ChatGPT没两样&#xff0c;只是多了几个功能入口&#xff1f; 这篇文章&…...

Neo4j 5.x 安装后登录不上?别慌,这可能是默认密码策略在“搞鬼”

Neo4j 5.x 登录问题全解析&#xff1a;从密码策略到实战解决方案 刚接触Neo4j 5.x的开发者们&#xff0c;是否遇到过这样的场景&#xff1a;按照老教程满怀期待地输入默认用户名密码&#xff0c;却发现无论如何都登录不上Web控制台&#xff1f;这不是你的操作问题&#xff0c;…...