【问题标题】:Value Assignment for State inside a reducer being performed twice减速器内的状态值分配被执行两次
【发布时间】:2021-04-23 21:16:53
【问题描述】:

我正在使用 Reacts useReducer 钩子。我正在尝试增加 +1 或 -1,具体取决于按下 react 上的哪个按钮。我希望在返回值之前分配值,以便可以将值发布到数据库。当我运行代码时,它在 0-1 上增加 1,但之后它增加 2。我尝试使用 console.log 查看值更改,它只运行了一次 console.log,但运行了两次增量分配。在返回对象之前,如何在案例内只运行一次值分配。它还为每个值更改运行 POST 请求,(2次)

const reducer = (state, action) => {
  switch (action.type) {
      case "increment":{


   
    state.count = state.count +1;
    console.log("Inside Reducer, state.count", state.count);
    postFourthButtonClick(state.count)
   
    return { count: state.count}
}
case "decrement":{

    state.count -=1;
    console.log("Inside decrement part of reducer, state.count:", state.count);
    postFourthButtonClick(state.count);
    return {count: state.count}
}
default:
  throw new Error();

}

【问题讨论】:

  • 当您在返回值之前明确地为state.count 分配一个新值时,您正在改变您的状态。有关增量的实现,请参阅文档:React: useReducer

标签: javascript reactjs object switch-statement use-reducer


【解决方案1】:

您不应该在 reducer 函数中真正执行副作用(例如发出 API 请求)。副作用属于 useEffect 钩子。

你想做的大概是这样的:

const reducer = (state, action) => {
  switch (action.type) {
    case "increment": {
      return { count: state.count + 1 };
    }
    case "decrement": {
      return { count: state.count - 1 };
    }
    default:
      throw new Error();
  }
};

您将拥有一个调用您的 api 的 useEffect 钩子。

默认情况下,useEffect 在第一次渲染后和每次更新后都会运行。如果您希望每次某个值更改时都重新运行它,您可以将该值放入依赖项数组中。

useEffect(()=>{
    makeSideEffect()
}, [valueThatDecidesWhenToRerun])

【讨论】:

  • 我试图在 switch 语句的情况下运行 POST 请求,以便在每次递增或递减时将 POST 发送到数据库。如果我将增量​​或减量放在 return 语句中,那么我将无法使用具有更新值的 POST 请求。
  • 我做了一个编辑来回答这个问题。我希望这能回答你的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 2022-01-25
  • 2022-11-26
  • 2019-04-11
  • 2017-11-27
相关资源
最近更新 更多