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函數(shù)包裝一下,再將store傳遞過去即可,使用起來很簡(jiǎn)單,那么關(guān)鍵就是這個(gè)applymiddleware函數(shù)了,這個(gè)函數(shù)式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)
    }

    // 依次調(diào)用傳進(jìn)來的middleware 并且調(diào)用middleware  傳入 middlewareAPI
    chain = middlewares.map(middleware => middleware(middlewareAPI))

    //依次調(diào)用傳入了middlewareAPI 的 middleware集合 再傳入一個(gè)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)))
}

可能上面有注釋這兩句看起來有點(diǎn)暈, 其實(shí)多看幾次就明白了。這里用了componse函數(shù),在下面也有給出。
applymiddleware函數(shù)我們看完了, 那么middleware我們?cè)趺磥韺懩??這里給出一個(gè)例子,就是著名的redux-thunk的代碼,這么著名的第三方庫實(shí)際上只有那么幾行。

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;

這里面有連續(xù)三個(gè)=> 看起來更暈了。哈哈??梢苑植紒砜聪?/p>

image.png

applymiddleware中這里面我們調(diào)用了middleware 并且傳入了middlewareAPI 看是不是就是{ dispatch, getState}這個(gè)參數(shù)。

image.png

而這里我們又調(diào)用了一次,并且傳遞了store.dispatch。實(shí)際上就是這里的next參數(shù)。這個(gè)匿名函數(shù)參數(shù)是next,即傳遞過來的store.dispatch。返回了一個(gè)函數(shù),參數(shù)為action,返回的這個(gè)函數(shù)即一個(gè)store.dispatch。然后我們可以通過根據(jù)這個(gè)action類型來判斷該怎么處理。

函數(shù)很簡(jiǎn)單,設(shè)計(jì)很精妙。讀源碼確實(shí)能學(xué)習(xí)到很多知識(shí)。

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

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

  • 用法 為了對(duì)中間件有一個(gè)整體的認(rèn)識(shí),先從用法開始分析。調(diào)用中間件的代碼如下: 源碼 createStore.js#...
    黃子毅閱讀 9,737評(píng)論 4 19
  • 為什么dispatch需要middleware 上圖表達(dá)的是 redux 中一個(gè)簡(jiǎn)單的同步數(shù)據(jù)流動(dòng)的場(chǎng)景,點(diǎn)擊 b...
    一個(gè)胖子的我閱讀 2,139評(píng)論 1 9
  • 前言 本文 有配套視頻,可以酌情觀看。 文中內(nèi)容因各人理解不同,可能會(huì)有所偏差,歡迎朋友們聯(lián)系我討論。 文中所有內(nèi)...
    珍此良辰閱讀 12,211評(píng)論 23 111
  • Redux這個(gè)npm包,提供若干API讓我們使用reducer創(chuàng)建store,并能更新store中的數(shù)據(jù)或獲取st...
    不安分的三好份子閱讀 1,063評(píng)論 0 0
  • 總需要付出一些光陰, 才能慢慢走進(jìn)一杯茶的心里…… 圖文:茶小科 主題:喝茶 犀利、辛辣、嘲諷、尖酸,是文學(xué)家、思...
    茶小科閱讀 800評(píng)論 0 1

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