Javascript 依赖状态切片的Redux减速器/状态形状设计

Javascript 依赖状态切片的Redux减速器/状态形状设计,javascript,redux,reducers,Javascript,Redux,Reducers,我喜欢Redux中减速器组合的概念,但遇到了一个场景,我想将减速器拆分,但是子减速器将依赖其他减速器的状态片进行更改 例如 在我所在的州,我需要跟踪以下信息: 一系列可能的等级(即[2,3,4,5,6]) 当前选择的等级(上述值之一) 根据所选的等级,一系列可能的培训级别。关系是范围从[1..(selectedRank-1)] 当前选定的培训级别在上述范围内 最初,我有一个更大的减速器,它封装了所有这些方面: function rankAndTraining(state = { sele

我喜欢Redux中减速器组合的概念,但遇到了一个场景,我想将减速器拆分,但是子减速器将依赖其他减速器的状态片进行更改

例如

在我所在的州,我需要跟踪以下信息:

  • 一系列可能的等级(即
    [2,3,4,5,6]
  • 当前选择的等级(上述值之一)
  • 根据所选的等级,一系列可能的培训级别。关系是范围从
    [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真的是我能得到的状态的“最小部分”吗?或者有没有更好的方法来拆分它,我可能看不到?

如果您使用Redux thunk中间件,您可以在实际分派操作之前先检查整个状态,而不是分派操作,然后在reducer中有条件地更新状态:

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());
  };
}