2016-11-22 80 views
1

我創建了一些工廠函數,它們爲我提供了簡單(或更高級)的reducer。例如(簡單的 - 行動型的基礎設置RequestState常數的值):在Redux中編寫高階縮減器

export const reduceRequestState = (requestTypes: RequestActionTypes) => 
    (state: RequestState = RequestState.None, action: Action): RequestState => { 
     switch (action.type) { 
      case requestTypes.start: 
       return RequestState.Waiting; 
      case requestTypes.success: 
       return RequestState.Success; 
      case requestTypes.error: 
       return RequestState.Error; 
      case requestTypes.reset: 
       return RequestState.None; 
      default: 
       return state; 
     } 
    }; 

使用這些工廠函數和reduxcombineReducers我可以撰寫他們入處理大部分的我不經意的動作功能齊全的減速。這給了我可讀的代碼,並防止我犯愚蠢的錯誤。

工廠對於常見操作很有幫助,但是當我需要添加一些自定義行爲(對於操作類型),這應該會顯着修改商店的某些部分,我想編寫一個可以處理該操作的自定義部分我。 這個想法是以迭代的方式組成減速器,所以combineReducers但是對於一個數組。這樣我就可以使用我的工廠創建Reducer,然後將其與我的自定義Reducer結合起來處理一些特定的操作。數組的combineReducers然後會調用第一個,認識到沒有任何變化,並調用第二個(自定義)處理該動作。

我正在尋找一些解決方案,發現redux-actions,但不太喜歡它鏈接動作和減速器的方式,使得語義與我以前所用的語義有點不同。也許我不明白,但最終我希望看到我的減速器被寫成純功能。

我找的一些提示,會告訴我的方式。 是否有任何圖書館或項目使用任何一種更高階的減速器並以某種方式將它們組合在一起? 關於如上所述組成減速器有什麼不利之處嗎?

回答

2

沒錯,因爲減速是只是功能,還有的可以組織邏輯方式無限數量,並組成多個功能結合在一起是非常鼓勵

您正在尋找的「減少數組」的想法是https://github.com/acdlite/reduce-reducers。我經常在我自己的應用程序中使用它來完成這種行爲 - 先運行一個combineReducers生成的reducer,然後依次運行reducer以獲得更具體的行爲。

我已經爲Redux文檔編寫了一個名爲Structuring Reducers的部分,其中涵蓋了與減速器邏輯相關的一些主題。這包括超出通常的combineReducers方法的有用模式。

我還有一個列表many other reducer-related utilities作爲我的Redux addons catalog的一部分。