Redux applyMiddleware 原理剖析

232 篇文章 0 订阅
219 篇文章 0 订阅

Redux applyMiddleware 原理剖析

 

最近在总结最近用的知识,好记性不如烂笔头,所以写出来记录下。

“It provides a third-party extension point between dispatching an action, and the moment it reaches the reducer.” 
这是 Dan Abramov 对 middleware 的描述。它提供了一个分类处理 action 的机会。在 middleware 中,你可以检阅每一个流过的 action,挑选出特定类型的 action 进行相应操作,给你 一次改变 action 的机会。

应用 middleware 后 Redux 处理事件的逻辑

我们还是从实际出发,再来看下内部构造:

 

打印日志中间件

白名单中间件

applyMiddleware中间件的源码非常精炼,大约只有20多行。

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
    }
  }
}

 

看懂这段代码,需要提前了解函数式编程compose以及pipe思想,其实就是一个传参数据流,一个从右到左一个从左到右。我们带着问题去看这段代码,为什么我们平时写的时候要传入(store) => (next) => (action)这三个参数?

代码前几行创建了store,createStore后面三个参数是Redux原生createStore方法的标准参数。下面的middlewareAPI其实就是一个精简的store,并且提供了getState和dispach方法。

接下来来看compose,compose顾英文名思中国义即组合函数,将多个函数组合起来串联执行,一个函数的输出作为另一个函数的输入,一旦第一个函数开始执行,过程就会像多米诺骨牌。

let result = compose(f1, f2, f3, f4)(value); ====> let result = f1(f2(f3(f4(value))));

 chain = middlewares.map(middleware => middleware(middlewareAPI))
 dispatch = compose(...chain)(store.dispatch)

dispatch = compose(...chain)(store.dispatch)

可以变化为:

fnMiddle = fn(middlewareAPI);

dispatch = fnMiddle(store.dispatch)

最后等价于:

dispatch = fn(middlewareAPI)(store.dispatch)

接着:
store.dispatch(action) 
等价于
fn(middlewareAPI)(store.dispatch)(action) == 对应middleware的三个参数store, next, action。

dispatch = compose(...chain)(store.dispatch) === dispatch= fn1Middle(fn2Middle(store.dispatch))

// fn1Middle = fn1(middlewareAPI)

首先执行的是fn2Middle(store.dispatch),返回结果是如下的一个函数。紧接着fn1Middle( (action) => {} ),这个action函数相当于占据了fn1中next参数的位置。在收到action参数之前呢函数并不会执行。

// fn2Middle(store.dispatch)执行后
(action) => {
    ....
    next(action)
    ....
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redux 是一种 JavaScript 状态管理库,它可以帮助我们管理应用程序中的状态,并且可以在整个应用程序中共享状态。Redux 的实现原理主要有以下几个方面: 1. Store:Redux 应用程序中的所有状态都存储在一个单一的、不可变的存储区域中,称为 "store"。store 是一个纯 JavaScript 对象,它包含了整个应用程序的状态。store 还包含了一些方法,用于获取状态、监听状态变化、更新状态等操作。 2. Action:Redux 应用程序中的状态只能通过 "action" 来修改。action 是一个描述状态变化的普通 JavaScript 对象,它必须包含一个 "type" 属性,用于描述变化的类型。action 还可以包含一些其他的数据,用于描述变化的具体内容。 3. Reducer:Redux 应用程序中的状态修改是通过 "reducer" 来实现的。reducer 是一个纯函数,它接受当前的状态和一个 action,然后返回一个新的状态。reducer 不能修改原来的状态,它只能返回一个全新的状态。Redux 应用程序中可能会有多个 reducer,每个 reducer 负责管理一个部分状态。 4. Dispatch:Redux 应用程序中的状态修改是通过 "dispatch" 来触发的。dispatch 是一个方法,它接受一个 action,然后将 action 发送给所有的 reducer。每个 reducer 都会接收到 action,然后根据 action 的类型来修改自己管理的状态。 5. Subscribe:Redux 应用程序中的状态变化是通过 "subscribe" 来监听的。subscribe 是一个方法,它接受一个回调函数,每当状态发生变化时就会调用这个回调函数。我们可以在回调函数中获取最新的状态,然后根据状态来更新应用程序的界面。 综上所述,Redux 的实现原理就是通过 store、action、reducer、dispatch 和 subscribe 这些机制来实现状态管理的。通过这些机制,我们可以将应用程序中的状态集中管理,从而带来更好的可维护性、可扩展性和可重用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值