Redux-Middleware 中间件原理分析

Redux 是一个极为流行的状态管理工具,它被广泛应用于 React 应用中。Redux 的核心概念是 Store,但是如果把所有的逻辑都写在 Store 中会使得代码变得复杂且难以维护。因此,Redux 提供了 Middleware 的概念来弥补这一缺陷。本文将深入分析 Redux-Middleware 中间件的原理和用法。

Redux-Middleware 是什么?

在 Redux 中, 中间件就是介于 Action 和 Reducer 之间的一个处理过程。Redux-Middleware 是一种被广泛使用的 Redux 中间件,它提供了一个统一的、可插拔的机制来扩展 Redux 基于应用。它可以用于检测非法 Action、异步行为(例如跨域请求)等没有被 Reducer 所处理的行为。

Redux-Middleware 的处理流程如下:

  1. 根据中间件定义的条件过滤 Action;

  2. 对 Action 进行某种处理,例如记录日志、转化 Action 或切片 Payload;

  3. (可选)内部发起异步操作;

  4. (可选)异步操作执行完毕后,继续将 Action 传递到下一个 Middleware 或 dispatch 到 Reducer。

Redux-Middleware 的使用方法

使用 Redux-Middleware 需要遵循以下步骤:

  1. 引入 Redux-Middleware 库和相应的中间件;

  2. 在 Store 的创建过程中使用 applyMiddleware 来注入 Middleware。

示例代码如下:

------ - ------------ --------------- - ---- --------
------ ------ ---- ---------------
------ ----- ---- --------------
------ ----------- ---- -------------

----- ---------- - ------- --------
----- ----- - ------------
   ------------
   ------------------------------
--

这段代码导入了两种常见的 Middleware —— logger 和 thunk ,并将它们作为参数传递给 applyMiddleware 函数。applyMiddleware 函数接收所有要使用的 Middleware 数组,并创建一个新的 Store。

在创建 Middleware 之前,我们需要安装对应的库。logger 和 thunk 均受到广泛支持,可以通过 npm 安装:

--- ------- ------------ ----------- ------

其中,logger 用于在控制台上记录 Action 和状态变化,从而方便调试;thunk 用于处理 Redux 异步流程。每个 Middleware 都必须从上一个 Middleware 接收一个 Action 并返回一个 Action。你也可以在 Middleware 内部发起自定义的异步操作,通过 Promise 来异步完成并返回结果,然后通过 dispatch 来派发 Action 到下一个 Middleware 或 Reducer。

Middleware 的原理分析

了解了 Redux-Middleware 的使用方法之后,下面我们将深入分析它的原理。

Redux-Middleware 依赖于 Function 的柯里化来实现对函数的预处理。具体而言,Reducer 是对 Store 中应用程序状态更改的具体控制,中间件传递的是原始的 dispatch。因此,Middleware 本质上是对柯里化函数的操作,例如 redux-thunk 库中的 applyMiddleWare 的代码如下:

-------- ------------------------------- -
  ------ ----------- -- --------- -- -
    ----- ----- - ---------------------
    --- -------- - -- -- -
      ----- --- ------
         ------------ ----- ------------ ---- ---------- -- --- ---------
      --
    --

    ----- ------------- - -
      --------- ---------------
      --------- --------- -- ------------------
    --
    ----- ----- - -------------------------- -- ---------------------------
    -------- - ----------------------------------

    ------ -
      ---------
      ---------
    --
  --
-

applyMiddleware 函数通过接收一个或多个中间件函数的数组来生成一个新的函数,并返回一个被装饰后的 createStore 函数。

首先,applyMiddleware 接收 createStore 函数,并返回一个新的函数。当这个函数被调用时,调用链上所有中间件的实例将被创建。每个中间件实例应该将其 API 暴露给下一个中间件,同时将其自己作为 dispatch 的行为附加到这个 API 上。由于中间件实例彼此独立,所以每个中间件都可用来修改整个调用链。最后,applyMiddleware 在 dispatch 上创建一个组合所创建的调用链提供给整个应用程序。

下面我们来具体分析一下 applyMiddleware 的实现逻辑:

  1. 使用 createStore 函数创建 store;

  2. 允许 中间件 访问 getState 和 dispatch API;

  3. 遍历包含传入的每个 Middleware 的中间件数组,并调用每个中间件函数。每个中间件函数接收 Middleware API 作为参数,并返回一个新函数,此新函数接收参数 next。此新函数的 return(在我们的例子中,即 p1)被设置为下一个函数(这个函数是下一个 Middleware 的新函数或是 Real Dispatch)。参数“next”只是对下一个函数的引用,如果“next”调用了一个参数并返回结果,那么这个 Middleware 函数将拿到返回的结果。如果“next”调用时未附带参数,一个由下一个 Middleware 提供的普通的 dispatch 方法会被传递过来。

  4. 最后,将所有中间件连接起来形成一个链。在现有调用链的顶部添加一个新函数,这个函数将调用连接的函数,即 reducer 的实现。这个函数被提供给创建 store 的过程,并作为一个新的 dispatch 版本。dispatch 版本将作为整个程序的入口,并触发调用链中的每一个中间件函数。总的执行顺序是由 Middleware 生成链的顺序决定的。

结论

Redux-Middleware 是 Redux 中极其重要的特性之一,它可以非常方便地对各种 Action 序列进行处理。在本文中,我们讲解了 Redux-Middleware 的基本用法,并深入分析了它的实现原理。希望读者能够通过本文了解 Redux-Middleware,进一步加深对 Redux 的理解,提高自己的应用程序开发能力。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/670b787cd91dce0dc88acee4


猜你喜欢

  • Hapi 框架优化技巧:降低内存占用,提高性能

    Hapi 是一个强大且可扩展的 Node.js Web 框架,广泛用于构建 Web 应用、API 和服务。但是,在处理大量请求时,Hapi 框架的内存占用可能会变得非常高,从而影响服务的性能。

    9 天前
  • Fastify: 高效并发处理 WebSocket

    Fastify 是一个高效的 Web 框架,适用于构建高性能的 Web 应用程序。它被设计成快速、简单且易于扩展的,具有良好的内存使用率和稳定的性能。Fastify 通过内置的 WebSocket 模...

    9 天前
  • 用 ECMAScript 2020 中的可选链来安全地访问深层嵌套的对象属性

    什么是可选链? 在过去,访问嵌套对象属性是一项很繁琐的任务,需要手动检查每个属性是否存在。在 ECMAScript 2020 中,可选链这一特性的出现简化了这一过程。

    9 天前
  • 如何使用 SASS 编写响应式设计?

    在当今的 Web 开发领域中,响应式设计已成为一个必要的技能。为了实现响应式设计,我们可以使用 CSS 和 SASS。本篇文章将会介绍如何使用 SASS 编写响应式设计。

    9 天前
  • Vue.js 中遇到的组件 props 属性传递问题解决方案

    在 Vue.js 中,组件是开发的重要组成部分。当我们在应用中进行组件传值时,经常会遇到一些问题,例如组件的 props 属性传递。 问题描述 在 Vue.js 中,组件通过 props 属性进行通信...

    9 天前
  • 使用 Koa2 实现跨域资源共享(CORS)

    跨域资源共享 (CORS) 是 Web 应用程序中常用的安全机制,它允许 Web 应用程序从不同的源(domain、scheme、或者 port)请求资源,并允许服务器响应。

    9 天前
  • Tailwind CSS 中的响应式图片样式的详细教程

    在现代的网站和应用程序中,响应式设计已经成为了一个必须要考虑的因素。而在这个过程中,图片通常是必不可少的一部分。因此,在开发网站和应用程序时,我们需要确保图片在不同设备上具有良好的响应性。

    9 天前
  • Redis 使用教程:设置过期时间

    序言 Redis 是一个非常流行的内存数据库,在前端开发中我们经常使用 Redis 来进行数据缓存,以减轻服务器端的负担。在 Redis 中,我们可以为每个存储的 key 设置过期时间,以便在一定时间...

    9 天前
  • Web Components 开发常见错误及解决方法

    Web Components 是一种基于 Web 平台的技术,可以让开发者创建可重用的自定义 HTML 元素。由于其优秀的可复用性和可组合性,越来越多的前端开发者开始使用 Web Components...

    9 天前
  • 如何在无障碍网站中应用 WAI-ARIA 的最佳实践

    随着互联网的普及,无障碍网站设计已经变成越来越重要的话题。对于那些缺失视力、听力或者其他障碍的用户来说,访问和使用网站可能会变得极为繁琐和受限。WAI-ARIA(Web Accessibility I...

    9 天前
  • Socket.io 与 Kafka 的实时数据传输方案

    实时数据传输是当今互联网应用中重要的一环,能够将数据快速地从一个应用程序传输到另一个应用程序。当然,要实现实时数据传输需要选择合适的技术方案。本文将介绍 Socket.io 和 Kafka,以及它们如...

    9 天前
  • RxJS 实战:如何处理重复的值?

    RxJS 是一个强大的响应式编程库,它提供了一种函数响应式编程的解决方案,并且在前端开发中被广泛应用。在使用 RxJS 时,我们经常会遇到一些重复的值,这时候必须对它们进行处理。

    9 天前
  • 在 ES6 和 ES7 中使用 Object.create() 方法来创建对象

    在 JavaScript 中,创建对象是一项基本任务。一般来说,可以使用字面量对象 ({}) 或构造函数 (例如 new Object()) 来创建对象。但是,这些方法都有其限制,而使用 Object...

    9 天前
  • RESTful API 中的 API 网关重构方法

    在现代的软件系统中,RESTful API 已经成为了不可或缺的部分。而在 RESTful API 的设计中,API 网关是非常重要的环节。API 网关可以处理请求的路由、限流、重试等逻辑,同时也可以...

    9 天前
  • 使用 Web Workers 优化 PWA 应用程序性能

    随着移动浏览器的不断发展,越来越多的网站和应用程序将它们的目光转向了 PWA(渐进式 Web 应用程序),以提供更好的离线体验和更快的加载速度。然而,PWA 应用程序的性能问题往往是一个挑战。

    9 天前
  • Chai 如何控制错误信息输出

    Chai 是一个流行的 JavaScript 断言库,用于编写测试以确保代码的正确性。在测试期间,可能会出现一些错误,这些错误可以以不同的方式呈现给开发人员。本文将介绍如何使用 Chai 库来控制错误...

    9 天前
  • Jest Snapshot:如何生成与使用

    Jest 是一个由 Facebook 开发的 JavaScript 测试框架,它支持多种测试类型,包括单元测试、集成测试和端到端测试等等。其中,快照测试是 Jest 最为流行的一种测试类型之一,它可以...

    9 天前
  • Serverless 架构和 Docker 容器之间的比较与区别

    Serverless 架构和 Docker 容器是当今流行的两种云计算技术,它们都可以帮助我们实现快速部署、可伸缩的应用程序。但是 Serverless 架构和 Docker 容器之间存在许多关键的区...

    9 天前
  • 在 Kubernetes 中发布自定义应用程序的完整指南

    如今,Kubernetes 在云计算和容器编排领域得到越来越广泛的应用。同时,随着前端技术的发展,前端应用程序也越来越复杂。如果你是一个前端开发者,你可以将你的自定义应用程序部署到 Kubernete...

    9 天前
  • 把 reselect 作为 redux 数据处理的最后一步

    在 Redux 应用程序中,使用 reselect 可以更高效地处理数据。reselect 可以将平深层次嵌套的多个数据连接为一个数据,并有助于组织以前使用链式调用嵌套映射器的代码。

    9 天前

相关推荐

    暂无文章