Redux减速器/状态

我喜欢Redux中reducer构成的概念,但遇到了我想分割reducer的场景,但儿童reducer将依赖其他人的state-slice来进行修改。

例如

在我的状态下,我需要跟踪以下内容:

  • 一系列可能的等级 (即[ 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中间件,则可以在实际调度您的动作之前先检查整个状态,而不是调度您的动作,然后有条件地更新减速器中的状态:

    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

    链接地址: http://www.djcxy.com/p/30163.html

    上一篇: Redux reducer / state

    下一篇: DialogFragment overlap by status bar