• <noscript id="ggggg"><dd id="ggggg"></dd></noscript>
    <small id="ggggg"></small> <sup id="ggggg"></sup>
    <noscript id="ggggg"><dd id="ggggg"></dd></noscript>
    <tfoot id="ggggg"></tfoot>
  • <nav id="ggggg"><cite id="ggggg"></cite></nav>
    <nav id="ggggg"></nav>
    成人黃色A片免费看三更小说,精品人妻av区波多野结衣,亚洲第一极品精品无码,欧美综合区自拍亚洲综合,久久99青青精品免费观看,中文字幕在线中字日韩 ,亚洲国产精品18久久久久久,黄色在线免费观看

    理解 redux-thunk 源碼

    2020-6-5    seo達(dá)人

    前言

    前面幾篇我們就 Redux 展開了幾篇文章,這次我們來實現(xiàn) react-thunk,就不是叫實現(xiàn) redux-thunk 了,直接上源碼,因為源碼就11行。如果對 Redux 中間件還不理解的,可以看我寫的 Redux 文章。


    實現(xiàn)一個迷你Redux(基礎(chǔ)版)

    實現(xiàn)一個Redux(完善版)

    淺談React的Context API

    帶你實現(xiàn) react-redux

    為什么要用 redux-thunk

    在使用 Redux 過程,通過 dispatch 方法派發(fā)一個 action 對象。當(dāng)我們使用 redux-thunk 后,可以 dispatch 一個 function。redux-thunk會自動調(diào)用這個 function,并且傳遞 dispatch, getState 方法作為參數(shù)。這樣一來,我們就能在這個 function 里面處理異步邏輯,處理復(fù)雜邏輯,這是原來 Redux 做不到的,因為原來就只能 dispatch 一個簡單對象。


    用法

    redux-thunk 作為 redux 的中間件,主要用來處理異步請求,比如:


    export function fetchData() {

     return (dispatch, getState) => {

       // to do ...

       axios.get('https://jsonplaceholder.typicode.com/todos/1').then(res => {

         console.log(res)

       })

     }

    }

    redux-thunk 源碼

    redux-thunk 的源碼比較簡潔,實際就11行。前幾篇我們說到 redux 的中間件形式,

    本質(zhì)上是對 store.dispatch 方法進(jìn)行了增強(qiáng)改造,基本是類似這種形式:


    const middleware = (store) => next => action => {}

    在這里就不詳細(xì)解釋了,可以看 實現(xiàn)一個Redux(完善版)


    先給個縮水版的實現(xiàn):


    const thunk = ({ getState, dispatch }) => next => action => {

       if (typeof action === 'function') {

           return action(dispatch, getState)

       }

       return next(action)

    }

    export default thunk

    原理:即當(dāng) action 為 function 的時候,就調(diào)用這個 function (傳入 dispatch, getState)并返回;如果不是,就直接傳給下一個中間件。

    完整源碼如下:


    function createThunkMiddleware(extraArgument) {

     return ({ dispatch, getState }) => next => action => {

       // 如果action是一個function,就返回action(dispatch, getState, extraArgument),否則返回next(action)。

       if (typeof action === 'function') {

         return action(dispatch, getState, extraArgument)

       }

       // next為之前傳入的store.dispatch,即改寫前的dispatch

       return next(action)

     }

    }


    const thunk = createThunkMiddleware()

    // 給thunk設(shè)置一個變量withExtraArgument,并且將createThunkMiddleware整個函數(shù)賦給它

    thunk.withExtraArgument = createThunkMiddleware


    export default thunk

    我們發(fā)現(xiàn)其實還多了 extraArgument 傳入,這個是自定義參數(shù),如下用法:


    const api = "https://jsonplaceholder.typicode.com/todos/1";

    const whatever = 10;


    const store = createStore(

     reducer,

     applyMiddleware(thunk.withExtraArgument({ api, whatever })),

    );


    // later

    function fetchData() {

     return (dispatch, getState, { api, whatever }) => {

       // you can use api and something else here

     };

    }

    總結(jié)

    同 redux-thunk 非常流行的庫 redux-saga 一樣,都是在 redux 中做異步請求等副作用。Redux 相關(guān)的系列文章就暫時寫到這部分為止,下次會寫其他系列。

    日歷

    鏈接

    個人資料

    存檔

    主站蜘蛛池模板: 久久亚洲中文字幕精品一区| 久久久久亚洲精品| 中文字幕v亚洲ⅴv天堂| 欧美z0zo人禽交另类视频| 18禁黄久久久aaa片广濑美月| 国产欧美另类久久久精品丝瓜| 五月激情综合网| 丰满少妇一区二区三区专区| 欧美视频一区二区专区| 在线a视频免费观看| aaa国产一级毛片| 国产精品99久久久久久宅男| 亚洲第二十页中文字幕| 三江| 免费观看av在线播放| 強壮公弄得我次次高潮A片| 国产女主播喷水视频在线观看| 亚洲无码高清一区二区| 免费一级欧美在线大片| 日日噜噜噜夜夜爽爽狠狠视频| 精品久久久久久无码人妻VR| 国产成人无码aa片免费看| 国产精品久久久久久福利漫画 | 国产情侣自拍小视频| 色综合天天综合婷婷伊人| 无码精品视频一区二区三区 | 日本一区二区三区免费播放| 第一福利视频导航| 国产成人影院一区二区三区 | 三上悠亚网站在线观看一区二区 | 格尔木市| 美丽人妻系列无码专区| 亚洲夫妻性生活视频网站| 国产精品日本一区二区不卡视频| 又粗又硬又大又爽免费视频播放| 99热这里只有精品久久6| 又爽又黄又无遮挡的激情视频免费 | 美女张开腿让男人捅的视频 | 国产精品久久二区三区色裕 | 天美免费mv观看| 国色天香社区在线视频|