我有一个复杂的状态,其中基于某些条件调用其他归约函数. 在其他还原器中调用还原器是否是不好的做法?

我正在制作一个自定义挂钩来包装调度调用,因为我可能希望一些其他逻辑(后台调用、日志(log)记录等)与调度一起运行.

我在做我现在所做的事情之间犹豫不决,或者我可以将条件句从简化器中取出,然后在自定义挂钩中添加条件句.

根据我的研究,我可以做一些事情.

  1. 让它保持原样
  2. 将逻辑提炼成thunks,简化简化器
  3. 可能使用 Select 器来计算派生数据,但这可能无法按照我想要的方式更新我的状态
export const game = createSlice({
  name: 'game',
  initialState,
  reducers: {
    incrementScale: (state) => {
      state.currentScale = state.scales.pop()
      if (!state.currentScale) {
        state.isGameInProgress = false
      } else {
        game.caseReducers.incrementNote(state)
      }
    },
    incrementNote: (state) => {
      state.currentNote = state.notes.shift()
      if (!state.currentNote) {
        game.caseReducers.incrementScale(state)
      }

      state.triesLeft = INTIAL_TRIES
    }
  }
})

定制挂钩

export function useGame() {
   const handleIncrementNote() {
     //put the undefined checks and other logic in here instead?
     dispatch(incrementNote)
   }

}

推荐答案

我倾向于说不,你不应该从其他归约器中调用归约器,但在这种情况下,我认为这样做may是"安全的",因为你不会走出切片,尽管当scalesnotes都是空数组时,我确实看到了潜在的边缘情况,每个情况归约器都会调用另一个并创建一个循环并且永远不会返回.

我的建议是直接应用每个归约器 case 中的逻辑,并且独立于任何其他归约器,以消除它们之间逻辑循环的机会:

export const game = createSlice({
  name: 'game',
  initialState,
  reducers: {
    incrementScale: (state) => {
      state.currentScale = state.scales.pop();

      if (!state.currentScale) {
        state.isGameInProgress = false;
      } else {
        // game.caseReducers.incrementNote(state)
        state.currentNote = state.notes.shift();
        state.triesLeft = INTIAL_TRIES;
      }
    },
    incrementNote: (state) => {
      state.currentNote = state.notes.shift();

      if (!state.currentNote) {
        // game.caseReducers.incrementScale(state)
        state.currentScale = state.scales.pop();
      }

      state.triesLeft = INTIAL_TRIES;
    },
  },
});

Javascript相关问答推荐

如何按预期聚合SON数据?

如何使用JavaScript用等效的功能性HTML替换标记URL格式?

TypeScript索引签名模板限制

处理时间和字符串时MySQL表中显示的日期无效

如何添加绘图条形图图例单击角形事件

你怎么看啦啦队的回应?

Chart.js-显示值应该在其中的引用区域

用于在路径之间移动图像的查询

从另一个数组中的对应行/键值对更新数组中的键值对对象

在画布中调整边上反弹框的大小失败

钛中的onClick事件需要在两次点击之间等待几秒钟

如何在DYGRAPS中更改鼠标事件和键盘输入

如何在FastAPI中为通过file:/URL加载的本地HTML文件启用CORS?

背景动画让网站摇摇欲坠

通过跳过某些元素的对象进行映射

如何根据输入数量正确显示alert ?

JavaScript将字符串数字转换为整数

我如何才能获得价值观察家&对象&S的价值?

Refine.dev从不同的表取多条记录

在HTML中使用meta标记来指定定制元数据以用于使用JavaScript进行检索是不是一个坏主意?