理解Redux中間件

redux的中間件相當于改寫store的dispatch方法。
redux-applyMiddleware源代碼

export default function applyMiddleware(...middlewares) {
  return createStore => (...args) => {
    const store = createStore(...args)
    let dispatch = () => {
      throw new Error(
        `Dispatching while constructing your middleware is not allowed. ` +
          `Other middleware would not be applied to this dispatch.`
      )
    }
    let chain = []

    const middlewareAPI = {
      getState: store.getState,
      dispatch: (...args) => dispatch(...args)
    }
    chain = middlewares.map(middleware => middleware(middlewareAPI))
    dispatch = compose(...chain)(store.dispatch)

    return {
      ...store,
      dispatch
    }
  }
}

通過以下兩行源碼

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

可推導出redux給middleware函數(shù)暴露了通用的api,所有的middleware必須寫成

export default ({getState, dispatch} => next => {
    ...
})

其中next函數(shù)就是store的dispatch的引用,中間件內(nèi)部可以使用。此后dispatch方法會被改寫,中間件內(nèi)部的dispatch也是改寫后的dispatch。

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;

redux-thunk就是通過改寫dispatch方法實現(xiàn)兼容異步更改state的。注意next才是redux本身的dispatch方法的引用,中間件中的dispatch是compose(...chain)(store.dispatch)的返回值,已經(jīng)被改寫了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • “中間件”這個詞聽起來很恐怖,但它實際一點都不難。想更好的了解中間件的方法就是看一下那些已經(jīng)實現(xiàn)了的中間件是怎么工...
    Jmingzi_閱讀 1,770評論 1 7
  • http://gaearon.github.io/redux/index.html ,文檔在 http://rac...
    jacobbubu閱讀 80,411評論 35 198
  • 為什么dispatch需要middleware 上圖表達的是 redux 中一個簡單的同步數(shù)據(jù)流動的場景,點擊 b...
    一個胖子的我閱讀 2,122評論 1 9
  • Redux這個npm包,提供若干API讓我們使用reducer創(chuàng)建store,并能更新store中的數(shù)據(jù)或獲取st...
    不安分的三好份子閱讀 1,057評論 0 0
  • 在學習了redux過程中,了解到中間件這個名詞,但是我看了十遍,也完全就是懵逼的狀態(tài)。于是又重復敲了幾次代碼也不能...
    綽號陸拾柒閱讀 597評論 0 0

友情鏈接更多精彩內(nèi)容