文章出處

前言

用 React + Redux 已經一段時間了,記得剛開始用Redux 的時候感覺非常繞,總搞不起里面的關系,如果大家用一段時間Redux又看了它的源碼話,對你的理解會有很大的幫助。看完后,在回來看Redux,有一種 柳暗花明又一村 的感覺 .

源碼

我分析的是用 es6 語法的源碼,大家看目錄結構,一共有 6 個問件。先說下各個文件大概功能。

  • applyMiddlewar.js 使用自定義的 middleware 來擴展 Redux
  • bindActionCreators.js 把 action creators 轉成擁有同名 keys 的對象,使用時可以直接調用
  • combineReducers.js 一個比較大的應用,需要對 reducer 函數 進行拆分,拆分后的每一塊獨立負責管理 state 的一部分
  • compose.js 從右到左來組合多個函數,函數編程中常用到
  • createStore.js 創建一個 Redux Store 來放所有的state
  • utils/warnimng.js 控制臺輸出一個警告,我們可以不用看

我會按每個模塊的重要性,去做分析,今天就先把 createStore .js 分享給大家.

createStore.js (每行代碼都有注釋,可以直接查看源代碼)

本來我是把源代碼都給貼出來,博客園給移除了首頁,說代碼注釋太多,這我只能 簡化一下, createStore 主要返回四個方法

  • dispatch

    用于action的分發——在createStore中可以用middleware中間件對dispatch進行改造,比如當action傳入dispatch會立即觸發reducer,有些時候我們不希望它立即觸發,而是等待異步操作完成之后再觸發,這時候用redux-thunk對dispatch進行改造,以前只能傳入一個對象,改造完成后可以傳入一個函數,在這個函數里我們手動dispatch一個action對象,這個過程是可控的,就實現了異步。

  • subscribe

    監聽state的變化——這個函數在store調用dispatch時會注冊一個listener監聽state變化,當我們需要知道state是否變化時可以調用,它返回一個函數,調用這個返回的函數可以注銷監聽。 let unsubscribe = store.subscribe(() => {console.log('state發生了變化')})

  • getState

    獲取store中的state——當我們用action觸發reducer改變了state時,需要再拿到新的state里的數據。getState主要在兩個地方需要用到,一是在dispatch拿到action后,store需要用它來獲取state里的數據,并把這個數據傳給reducer,這個過程是自動執行的,二是在我們利用subscribe監聽到state發生變化后調用它來獲取新的state數據,如果做到這一步,說明我們已經成功了。

  • replaceReducer

    替換reducer,改變state修改的邏輯。

結束語

代碼已經放在 githunb 上,大家可以查看 更詳細的源碼 , 如果對你有幫助,請 Star 一下吧.


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()