跳至主要內容

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,並以不可變的方式更新狀態,而不是直接變異它。

進一步資訊

文件

討論

我必須使用 switch 敘述來處理動作嗎?

不。歡迎您使用任何您喜歡的方法在 Reducer 中回應動作。switch 敘述是最常見的方法,但使用 if 敘述、函數查詢表,或建立一個函數來抽象此方法也沒問題。事實上,雖然 Redux 確實要求動作物件包含一個 type 欄位,但您的 Reducer 邏輯甚至不必依賴它來處理動作。話雖如此,標準方法絕對是使用基於 type 的 switch 敘述或查詢表。

進一步資訊

文件

討論