2015-10-29 57 views
7

我喜歡Redux中還原器構成的概念,但遇到了像一樣將一個還原器分開的場景,但兒童減速器會依賴於從其他人的狀態切片進行更改。從屬狀態切片的Redux reducer /狀態設計

對於實施例

以我的狀態,我需要跟蹤下面的:

  • 的可能行列(即[ 2, 3, 4, 5, 6 ]
  • 當前所選等級A範圍(上述值之一)。
  • 取決於選定的排名,一系列可能的訓練水平。的關係是,範圍從[ 1 .. (selectedRank - 1) ]
  • 甲進入當前選定的訓練水平在上述範圍內

最初,我有一個較大的減速機,其包封的所有這些方面:

function rankAndTraining(state = { 
    selectedRank   : 4, 
    availableRanks   : [ 2, 3, 4, 5, 6 ], 
    availableTrainingLevels : [ 1, 2, 3 ], 
    selectedTrainingLevel : 2, 
}, action) { 
    . 
    . 
    . 
    case SELECT_RANK: 

     let newRank = action.rank; 

     if(!availableRanks.contains(newRank)) { 
     // If new rank is not an allowed value, do nothing. 
     return state; 
     } 

     // Update selectedRank with newRank... 

     // Update availableTrainingLevels array based on newRank... 
     // [ 1 ... (selectedRank - 1) ] 

     // Update selectedTrainingLevel if it is now out of range 
     // of availableTrainingLevel (i.e. set to highest value of new range) 

     return state; 
    . 
    . 
    . 
} 

我想分開這個reducer,因爲我認爲的排名爲的訓練水平可以保留在單獨的reducer中。

不過,也有全州段,將仍需如果減速器被分流至處理相關性,比如:

  • 如果新等級是無效的(當然這不是在。 availableRanks),那麼訓練級別比特不應該被更新。

如果我的訓練水平位分裂成另一個減速,那麼他們就沒有辦法知道這個「排名檢查」的結果,因爲所有他們會在他們的國家切片「看」是培訓等級件。

在這種情況下,鑑於它們之間的依賴關係,上述reducer是否是我可以獲取的狀態的「最小片段」?或者有沒有更好的方法來分割它,我可能沒有看到?

回答

3

如果你使用的終極版咚中間件可以先檢查整個狀態之前,你居然派遣你的動作在所有而不是派遣你的行動,然後有條件地更新減速的狀態:

function selectRankIfAllowed() { 
    return (dispatch, getState) => { 
    const { availableRanks } = getState(); 

    if(!availableRanks.contains(newRank)) { 
     // If new rank is not an allowed value, do nothing. 
     return state; 
    } 

    dispatch(selectRank()); 
    }; 
} 

https://github.com/gaearon/redux-thunk