Redux中间件

作者: VictorLiang | 来源:发表于2017-03-19 15:55 被阅读78次

在React中,常用Redux来做一些业务逻辑处理。
Redux提供了中间件的写法,可以对Redux中的数据流做一些自定义的处理(类似于OKHttp的interceptor机制)。

9c456d5d211602e9d742262c2bf45762_b.png-23.6kB9c456d5d211602e9d742262c2bf45762_b.png-23.6kB

创建中间件

中间件的语法是固定的, 它是一个三层的嵌套函数。 分别需要传递 store,next,action。store层主要的是我们需要获取store对象。中间件的链式调用主要通过对next的层层加工来实现,所以要有next层。之所以需要action,是因为我们最终还是个dispatch函数,最终还是需要action参数的。

export default store => next => action => {
    //action前的状态
    //做你想做的操作
    const returnValue = next(action);
    //action后的状态
    //做你想做的操作
    ...
    
    return returnValue;
}

加载中间件

当我们想让Redux启用某一个中间件的时候,需要在创建Store的时候生命需要应用那些中间件。

    const middleware = applyMiddleware(Middleware1, Middleware2...);
    return createStore(combinedReducer, initData, middleware)

具体applyMiddleware的逻辑:

/*
* @param {...Function} middlewares The middleware chain to be applied.
 * @returns {Function} A store enhancer applying the middleware.
 */
function applyMiddleware() {
  for (var _len = arguments.length, middlewares = Array(_len), _key = 0; _key < _len; _key++) {
    middlewares[_key] = arguments[_key];
  }

  return function (createStore) {
    return function (reducer, initialState, enhancer) {
      var store = createStore(reducer, initialState, enhancer);
      var _dispatch = store.dispatch;
      var chain = [];

      var middlewareAPI = {
        getState: store.getState,
        dispatch: function dispatch(action) {
          return _dispatch(action);
        }
      };
      chain = middlewares.map(function (middleware) {
        //解三层嵌套的第一层
        return middleware(middlewareAPI);
      });
      //解三层嵌套的第二层
      _dispatch = _compose2["default"].apply(undefined, chain)(store.dispatch);

      return _extends({}, store, {
        dispatch: _dispatch
      });
    };
  };
}

参数是...Function 类型,也就是多个Function类型的参数,每个都是一个要放到Store处理链中的中间件。返回的是一个Store Enchancer,当创建store的时候会传递过去。

chain = middlewares.map(function (middleware) {
        return middleware(middlewareAPI);
      });
...
_dispatch = _compose2["default"].apply(undefined, chain)(store.dispatch);

经过上面的两层调用,生成了新的dispatch。 之前我们提到过中间件是三层嵌套的函数,那么它的第三层调用是在哪呢? 没错,生成的dispatch会在Redux组件中被调用!
中间件是可以链式调用的,它是通过next()来实现的。next()其实就是当前中间件处理之后要返回的dispatch,返回后后面的中间件会对其继续处理,继续返回处理后的dispatch。

Redux-Thunk

Redux-Thunk的代码极其精简(注释)。 好机智的一个套路,感觉要上天。

//_ref 与我们之前applyMiddleware之中的 middlewareAPI是不是对应上了啊!!
function thunkMiddleware(_ref) {
  var dispatch = _ref.dispatch;
  var getState = _ref.getState;

  return function (next) {
    return function (action) {
      //Thunk 的action可不是plain text了,而是个function
      //Thunk 对应的action,一般会是个异步函数,在此调用
      //如果不是function类型的action,通过next直接传递给其他middleware
      return typeof action === 'function' ? action(dispatch, getState) : next(action);
    };
  };
}

相关文章

  • react 面试

    react redux (所有数据都放入redux管理) 1、redux中间件原理(middleware) 中间件...

  • 2-Redux中间件

    Redux 中间件 [toc] Redux 中间件的作用 Reudx 中的中间件是通过对 dispatch 进行的...

  • Redux 中间件源码清源

    网上的Redux中间件原理解释多有疏漏,譬如我在多篇blog上看到Redux中间件解释以及Redux中间件深入浅出...

  • Day17. Redux深入

    如何使用redux-thunk 中间件的使用, redux-thunk redux-devtools redux开...

  • [源码] Redux React-Redux01

    redux中间件洋葱模型imageimage redux中间件注意点image 导航 [深入01] 执行上下文[h...

  • react技术栈

    关于 Redux 中间件 Redux 的中间件是定义一个函数,对 dispatch 进行改造,在发出 action...

  • Redux-saga

    Redux-saga 概述 redux-saga是一个用于管理redux应用异步操作的中间件,redux-saga...

  • react项目中引入redux+react-router的一些写

    Redux + react-router 关于redux中间件的理解https://zhuanlan.zhihu....

  • redux

    使用步骤 redux只处理同步 redux处理异步请求中间件· 在引入redux的时候引入applyMiddlew...

  • redux源码解读

    Redux API 总览 浅谈redux 中间件的原理 原文 在 Redux 的源码目录 src/,我们可以看到如...

网友评论

    本文标题:Redux中间件

    本文链接:https://www.haomeiwen.com/subject/xgomnttx.html