初始化 State

初始化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。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章