redux-applyMiddleware

redux 中的middleware思想还是很巧妙地,先来看下怎么使用

export default function createStore(initialState = {}) {
  const middleware = [thunkMiddleware, promiseMiddleware, messageMiddleware];
  let finalCreateStore;
  finalCreateStore = applyMiddleware(...middleware)(_createStore);
  const store = finalCreateStore(reducer, initialState);
  return store;
}

就是将middleware 使用applymiddleware函数包装一下,再将store传递过去即可,使用起来很简单,那么关键就是这个applymiddleware函数了,这个函数式redux提供的,先来看下源码:

export default function applyMiddleware(...middlewares) {
  return (createStore) => (reducer, preloadedState, enhancer) => {
    const store = createStore(reducer, preloadedState, enhancer)
    let dispatch = store.dispatch
    let chain = []

    const middlewareAPI = {
      getState: store.getState,
      dispatch: (action) => dispatch(action)
    }

    // 依次调用传进来的middleware 并且调用middleware  传入 middlewareAPI
    chain = middlewares.map(middleware => middleware(middlewareAPI))

    //依次调用传入了middlewareAPI 的 middleware集合 再传入一个dispatch 再返回
    dispatch = compose(...chain)(store.dispatch)

    return {
      ...store,
      dispatch
    }
  }
}


export default function compose(...funcs) {
  if (funcs.length === 0) {
    return arg => arg
  }

  if (funcs.length === 1) {
    return funcs[0]
  }

  return funcs.reduce((a, b) => (...args) => a(b(...args)))
}

可能上面有注释这两句看起来有点晕, 其实多看几次就明白了。这里用了componse函数,在下面也有给出。
applymiddleware函数我们看完了, 那么middleware我们怎么来写呢?这里给出一个例子,就是著名的redux-thunk的代码,这么著名的第三方库实际上只有那么几行。

function createThunkMiddleware(extraArgument) {
  return ({ dispatch, getState }) => next => action => {
    if (typeof action === 'function') {
      return action(dispatch, getState, extraArgument);
    }

    return next(action);
  };
}

const thunk = createThunkMiddleware();
thunk.withExtraArgument = createThunkMiddleware;

export default thunk;

这里面有连续三个=> 看起来更晕了。哈哈。可以分布来看下


image.png

applymiddleware中这里面我们调用了middleware 并且传入了middlewareAPI 看是不是就是{ dispatch, getState}这个参数。

image.png

而这里我们又调用了一次,并且传递了store.dispatch。实际上就是这里的next参数。这个匿名函数参数是next,即传递过来的store.dispatch。返回了一个函数,参数为action,返回的这个函数即一个store.dispatch。然后我们可以通过根据这个action类型来判断该怎么处理。

函数很简单,设计很精妙。读源码确实能学习到很多知识。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 用法 为了对中间件有一个整体的认识,先从用法开始分析。调用中间件的代码如下: 源码 createStore.js#...
    黄子毅阅读 9,704评论 4 19
  • 为什么dispatch需要middleware 上图表达的是 redux 中一个简单的同步数据流动的场景,点击 b...
    一个胖子的我阅读 2,104评论 1 9
  • 前言 本文 有配套视频,可以酌情观看。 文中内容因各人理解不同,可能会有所偏差,欢迎朋友们联系我讨论。 文中所有内...
    珍此良辰阅读 12,146评论 23 111
  • Redux这个npm包,提供若干API让我们使用reducer创建store,并能更新store中的数据或获取st...
    不安分的三好份子阅读 1,046评论 0 0
  • 总需要付出一些光阴, 才能慢慢走进一杯茶的心里…… 图文:茶小科 主题:喝茶 犀利、辛辣、嘲讽、尖酸,是文学家、思...
    茶小科阅读 767评论 0 1

友情链接更多精彩内容