初始化State的方法有以下方法:
1.在創建store 的時候,createStore()方法的第二個參數preloadeState參數是初始化state的。
2.在reducer中設置state的初始值state={...},也可以使用ES6中默認的參數語法: function myReducer(state = someDefaultValue,action)如下代碼:
如果不使用 combineReducers()
或者類似的代碼,那麼 preloadedState
總是會優先於在 reducer
裏面使用 state = ...
,因爲 state
傳到
reducer 裏的是 preloadedState
的 state 而不是 undefined
,所以 ES6 的默認參數語法並不起作用。
如果使用 combineReducers()
方法,那麼這裏的行爲就會有一些細微的差別了。那些指定了 preloadedState
的
reducer 會接收到那些對應的 state。而其他的 reducer 將會接收到 undefined
並因此回到了 state = ...
這裏去獲取指定的默認值。
通常情況下,通過 preloadedState
指定的 state 要優先於通過 reducer 指定 state。這樣可以使通過 reducer 默認參數指定初始數據顯得更加的合理,並且當你從一些持久化的存儲器或服務器更新 store 的時候,允許你更新已存在的數據(全部或者部分)。
總結
綜上所述,如果你遵守 Redux 的約定並且要讓 reducer 中 undefined
的 state
參數返回初始 state (最簡單的實現方法就是利用 ES6 的默認參數來指定 state),那麼對於組合多個 reducers 的情況,這將是一個很有用的做法,他們會優先選擇通過 preloadedState
參數傳到 createStore()
的對象中的相應值,但是如果你不傳任何東西,或者沒設置相應的字段,那麼
reducer 就會選擇指定的默認 state
參數來取代。這樣的方法效果很好,因爲他既能用來初始化也可以用來更新現有的數據,不過如果數據沒有保護措施的話,這樣做也會使一些獨立的 reducer 的 state 被重新賦值。當然你可以遞歸地使用這個模式,比如你可以在多個層級上使用 combineReducers()
方法,或者甚至手動的組合這些
reducer 並且傳入對應部分的 state tree。