Redux 常見問題:Reducer
目錄
Reducer
如何讓兩個 reducer 共享狀態?我必須使用 combineReducers
嗎?
建議的 Redux 儲存結構是將狀態物件依據金鑰分割成多個「區段」或「網域」,並提供一個獨立的 reducer 函式來管理每個個別資料區段。這類似於標準 Flux 模式有多個獨立儲存,而 Redux 提供了 combineReducers
工具函式,讓這個模式更容易實作。不過,請注意 combineReducers
並非必要的,它只是一個用於常見案例的工具函式,每個狀態區段只有一個 reducer 函式,而資料則使用純粹的 JavaScript 物件。
許多使用者後來想嘗試在兩個 reducer 之間共用資料,但發現 combineReducers
不允許他們這麼做。有幾個方法可以使用
- 如果一個 reducer 需要知道來自另一個狀態區段的資料,可能需要重新整理狀態樹形狀,以便一個 reducer 處理更多資料。
- 你可能需要撰寫一些自訂函式來處理其中一些動作。這可能需要用你自己的頂層 reducer 函式取代
combineReducers
。你也可以使用一個工具程式,例如 reduce-reducers 來執行combineReducers
以處理大多數動作,但也可以執行一個更專業的 reducer 來處理跨狀態區段的特定動作。 - 具有非同步邏輯的中介軟體,例如 redux-thunk 可以透過
getState()
存取整個狀態。動作建立器可以從狀態中擷取其他資料並將其放入動作中,以便每個 reducer 都擁有足夠的資訊來更新其自己的狀態區段。
一般來說,請記住 reducer 只是函式,你可以隨意組織和細分它們,並且建議你將它們分解成更小的可重複使用函式(「reducer 組合」)。執行此操作時,你可以從父 reducer 傳遞自訂的第三個參數,如果子 reducer 需要額外資料來計算其下一個狀態。你只需要確保它們一起遵循 reducer 的基本規則:(state, action) => newState
,並以不可變的方式更新狀態,而不是直接變異它。
進一步資訊
文件
討論
- #601:當一個動作與多個 Reducer 相關時,combineReducers 的一個問題
- #1400:將頂層狀態物件傳遞給分支 Reducer 是否是一種反模式?
- Stack Overflow:使用合併的 Reducer 時,如何存取狀態的其他部分?
- Stack Overflow:使用 redux combineReducers 減少整個子樹
- 在 Redux Reducer 之間共享狀態
我必須使用 switch
敘述來處理動作嗎?
不。歡迎您使用任何您喜歡的方法在 Reducer 中回應動作。switch
敘述是最常見的方法,但使用 if
敘述、函數查詢表,或建立一個函數來抽象此方法也沒問題。事實上,雖然 Redux 確實要求動作物件包含一個 type
欄位,但您的 Reducer 邏輯甚至不必依賴它來處理動作。話雖如此,標準方法絕對是使用基於 type
的 switch 敘述或查詢表。
進一步資訊
文件
討論