Redux中間件

在React中郭赐,常用Redux來做一些業(yè)務邏輯處理率触。
Redux提供了中間件的寫法母蛛,可以對Redux中的數(shù)據(jù)流做一些自定義的處理(類似于OKHttp的interceptor機制)。

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

創(chuàng)建中間件

中間件的語法是固定的, 它是一個三層的嵌套函數(shù)腕柜。 分別需要傳遞 store,next,action寿羞。store層主要的是我們需要獲取store對象猖凛。中間件的鏈式調(diào)用主要通過對next的層層加工來實現(xiàn),所以要有next層绪穆。之所以需要action辨泳,是因為我們最終還是個dispatch函數(shù),最終還是需要action參數(shù)的玖院。

export default store => next => action => {
    //action前的狀態(tài)
    //做你想做的操作
    const returnValue = next(action);
    //action后的狀態(tài)
    //做你想做的操作
    ...
    
    return returnValue;
}

加載中間件

當我們想讓Redux啟用某一個中間件的時候菠红,需要在創(chuàng)建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
      });
    };
  };
}

參數(shù)是...Function 類型难菌,也就是多個Function類型的參數(shù)试溯,每個都是一個要放到Store處理鏈中的中間件。返回的是一個Store Enchancer郊酒,當創(chuàng)建store的時候會傳遞過去遇绞。

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

經(jīng)過上面的兩層調(diào)用,生成了新的dispatch燎窘。 之前我們提到過中間件是三層嵌套的函數(shù)摹闽,那么它的第三層調(diào)用是在哪呢? 沒錯褐健,生成的dispatch會在Redux組件中被調(diào)用付鹿!
中間件是可以鏈式調(diào)用的,它是通過next()來實現(xiàn)的蚜迅。next()其實就是當前中間件處理之后要返回的dispatch舵匾,返回后后面的中間件會對其繼續(xù)處理,繼續(xù)返回處理后的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,一般會是個異步函數(shù)亡蓉,在此調(diào)用
      //如果不是function類型的action晕翠,通過next直接傳遞給其他middleware
      return typeof action === 'function' ? action(dispatch, getState) : next(action);
    };
  };
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市砍濒,隨后出現(xiàn)的幾起案子淋肾,更是在濱河造成了極大的恐慌,老刑警劉巖爸邢,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件樊卓,死亡現(xiàn)場離奇詭異,居然都是意外死亡杠河,警方通過查閱死者的電腦和手機碌尔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來券敌,“玉大人唾戚,你說我怎么就攤上這事〈纾” “怎么了叹坦?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咱士。 經(jīng)常有香客問我立由,道長,這世上最難降的妖魔是什么序厉? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任锐膜,我火速辦了婚禮,結果婚禮上弛房,老公的妹妹穿的比我還像新娘道盏。我一直安慰自己,他們只是感情好文捶,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布荷逞。 她就那樣靜靜地躺著,像睡著了一般粹排。 火紅的嫁衣襯著肌膚如雪种远。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天顽耳,我揣著相機與錄音坠敷,去河邊找鬼妙同。 笑死,一個胖子當著我的面吹牛膝迎,可吹牛的內(nèi)容都是我干的粥帚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼限次,長吁一口氣:“原來是場噩夢啊……” “哼芒涡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卖漫,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤费尽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后羊始,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體依啰,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年店枣,在試婚紗的時候發(fā)現(xiàn)自己被綠了速警。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸯两,死狀恐怖闷旧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钧唐,我是刑警寧澤忙灼,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站钝侠,受9級特大地震影響该园,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜帅韧,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一里初、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忽舟,春花似錦双妨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浩姥,卻和暖如春挑随,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勒叠。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工兜挨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留竞阐,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓暑劝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親颗搂。 傳聞我的和親對象是個殘疾皇子担猛,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容