React高級篇(二)Redux工作流(react-redux)

《React高級篇(一)從Flux到Redux下硕,react-redux》文章中貼過一張redux單向數(shù)據(jù)流的圖海渊,但是角撞,從action到reduer,其實還缺少了不少環(huán)節(jié)褥民。

舉個例子季春,如果發(fā)起一個異步動作(比如網(wǎng)絡(luò)請求),該如何處理消返?redux單向數(shù)據(jù)流一定是同步的载弄,碰上異步Action耘拇,必須將其轉(zhuǎn)為同步Action,才可以繼續(xù)走下去宇攻,否則事件會被丟失惫叛。

再比如,如果需要給每個Action都要打Log逞刷,那么嘉涌,是否有個節(jié)點可以統(tǒng)一處理?

于是亲桥,store enhance(middleware是它的特殊實現(xiàn))出現(xiàn)了洛心,Action到達reducer之前固耘,會經(jīng)過一系列的enhancer處理看下圖:

redux flow.png

復(fù)習(xí):Store的創(chuàng)建方式

createStore(reducer, [preloadedState], [enhancer])

第三個參數(shù)即是enhancer题篷。

創(chuàng)建Store的enhancer

一個store對象中包含下列接口:

  • dispatch
  • subscribe
  • getState
  • replaceReducer

一般來說,自定義enhancer都是針對上述接口做能力增強厅目,比如提供日志功能的logEnhancer番枚,定義如下:

const logEnhancer = (createStore)  =>  (reducer,  preloadedState,  enhancer) =>  (
    const store= createStore(reducer,  preloadedState,  enhancer);
    const originalDispatch = store.dispatch;
    store.dispatch = (action) =>  {
        console.log('dispatch action:’,action);
        originalDispatch(action);
        return store;
};

增強器通常都使用這樣的模式损敷,將store上某個函數(shù)的引用存下來葫笼,給這個函數(shù)一個新的實現(xiàn),但是在完成增強功能之后拗馒,還是要調(diào)用原有的函數(shù)路星,保持原有的功能。

store enhancer和middleware的關(guān)系诱桂?

middleware本身就是一個store enhancer洋丐,它專門負(fù)責(zé)增強redux.dispatch()方法。middleware源碼示意如下:

export default function middleware(...middlewares) {
    return createStore => (...args) => 
        { // 省略 return { ...store, dispatch }
    }
}

注意:middleware應(yīng)該置于enhancer隊列的最前排挥等。

分發(fā)一個action時友绝,middleware通過next(action)一層層處理和傳遞action到Redux原生的dispatch。
如果某個middleware使用store.dispatch(action))分發(fā)action肝劲,會跳出middleware管道迁客,重新再來。如下圖:

redux.jpg
store.dispatch(action)的應(yīng)用場景

action默認(rèn)都是同步的辞槐。如果是一個異步Action(異步請求)掷漱,那么需要一個專門處理異步請求的middleware,這是會用到store.dispatch()榄檬。這樣卜范,異步工作流才可以被所有中間件處理,否則丙号,它只能被當(dāng)前位置之后的中間件處理先朦。

常用的異步流中間件處理庫為redux-thunk缰冤。

const thunk = store =>next => action =>
    typeof action === 'function' ? action(store.dispatch, store.getState) : next(action)

異步Acton設(shè)計如下:發(fā)起異步請求,如果成功喳魏,彈出成功彈框棉浸,否則,彈出錯誤彈框刺彩。

const getThenShow = (dispatch, getState) =>{
    const url = 'http://xxx.json';

    fetch(url)
        .then(response=>{
            dispatch({
                type: 'SHOW_MESSAGE_SUCCESS',
                message: response.json
            })
        })
        .catch(error=>{
            dispatch({
                type: 'SHOW_MESSAGE_FAIL',
                message: 'error'
            })
        })
}

后記

講redux-thunk相關(guān)的文章非常多迷郑,不再累述。

參考文章:淺析Redux 的 store enhancer创倔,書籍-《深入淺出react和redux》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗡害,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子畦攘,更是在濱河造成了極大的恐慌霸妹,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件知押,死亡現(xiàn)場離奇詭異叹螟,居然都是意外死亡,警方通過查閱死者的電腦和手機台盯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門罢绽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人静盅,你說我怎么就攤上這事良价。” “怎么了蒿叠?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵明垢,是天一觀的道長。 經(jīng)常有香客問我栈虚,道長袖外,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任魂务,我火速辦了婚禮曼验,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粘姜。我一直安慰自己鬓照,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布孤紧。 她就那樣靜靜地躺著豺裆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上臭猜,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天躺酒,我揣著相機與錄音,去河邊找鬼蔑歌。 笑死羹应,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的次屠。 我是一名探鬼主播园匹,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼劫灶!你這毒婦竟也來了裸违?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤本昏,失蹤者是張志新(化名)和其女友劉穎供汛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凛俱,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡紊馏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年料饥,在試婚紗的時候發(fā)現(xiàn)自己被綠了蒲犬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡岸啡,死狀恐怖原叮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巡蘸,我是刑警寧澤奋隶,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站悦荒,受9級特大地震影響唯欣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搬味,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一境氢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碰纬,春花似錦萍聊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至强戴,卻和暖如春亭螟,著一層夾襖步出監(jiān)牢的瞬間挡鞍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工预烙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匕累,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓默伍,卻偏偏與公主長得像欢嘿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子也糊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

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