《redux实战》第5章:中间件

139 阅读3分钟

本章学习内容已规整到对应专栏

前面几个章节,已经介绍了react/redux中的大部分常见内容:action、reducer和store,要使用redux更新应用程序的状态,这3部分不可或缺。另外,还有一个核心角色【中间件】,它是整个操作的关键部分。如果看了第4章的内容,应该比较清楚如何通过applyMiddleware函数将中间件应用到redux,但还不一定知道如何创建自己的中间件。

那在这章,将更深入地了解中间件的工作方式,如何创建它,以及它适合在什么场景下使用。在这个过程中,将通过一些经典用例创建自定义中间件来完善练习项目(chapter_five):

  • 记录action日志,用于快速了解程序正在发生什么;
  • 数据分析,提供一个方便的界面,进而在派发action时跟踪事件;
  • api调用,将有关服务器调用的通用任务抽象出来。

1、初窥中间件

中间件到底是什么?通常,中间件是指两个软件组件之间运行的代码,一般作为框架的一部分。在redux中,中间件是位于action(正在派发)和store(用于将action传递到reducer并广播更新状态)之间的代码,redux中间件允许跨多个action派发运行代码,比如:当有几条action经过中间件时,其中两条不满足中间件代码的触发条件,则这两个action在经过当前中间件时不触发代码的运行,而是直接穿过进入下一个中间件。

为了便于了解中间件代码位于action正常派发流程的哪一部分,再来看看架构图: 5.1-在最终状态被计算之前,action穿过中间件,然后穿过reducer.png

注意: 上图中间件位于store中,可将中间件视为跟store一起“注册”,当action被派发时,store将知道如何通过添加的中间件来传递action,当整个中间件链条完成时,action最终被传递给reducer以计算更新的状态。

2、中间件的基础知识

1)创建中间件

创建中间件包含两个简单的步骤:

  • 用正确的函数签名定义中间件,关于函数签名,redux中间件的函数签名如下:
const middlewareExample = store => next => action => { ... }

// 这相当于为每个新创建的中间件编写3个嵌套函数,用冗长一点的语法表示,则如下:
function storeWrapper(store) {
    // store,在需要基于现有状态做出决定时,可以直接在中间件中使用store object(如:通过store.getState方法能获取现有状态)。
    return function middlewareWrapper(next) {
        // 将action传递给链中的下一个中间件时调用的函数。
        return function handleAction(action){
            // 被派发的action,通常,中间件将对每个action执行一些操作(如:记录日志),或通过检查action.type的值来监视特定的action。
            ...
        }
    }
}
  • 使用redux的applyMiddleware函数将中间件和store一起注册。

2)组合中间件

中间件的一个重要方面在于它的链接能力,这意味着在store中可以应用多个中间件,每个中间件在完成工作后,会调用链中的下一个中间件。因此,创建的中间件都应该具有明确且单一的目标,从而使它们在不同的上下文中更易于组合和复用。

基于redux中间件都必须以相同的方式创建,所以将自己的中间件与第三方中间件结合起来使用时完全可行的,接下来就开始创建日志记录中间件,这是一个比较经典的中间件示例。

3、日志记录中间件

4、数据分析中间件

5、API中间件