Javascript 减速机内部状态的值分配将执行两次

Javascript 减速机内部状态的值分配将执行两次,javascript,reactjs,object,switch-statement,use-reducer,Javascript,Reactjs,Object,Switch Statement,Use Reducer,我使用的是Reacts useReducer钩子。我试图增加+1或-1,这取决于按下react上的哪个按钮。我希望在返回值之前分配该值,以便将该值发布到数据库。当我运行代码时,它在0-1上增加1,但在那之后它增加2。我尝试console.log查看值更改,它只运行了console.log一次,但运行了增量分配两次。在返回对象之前,如何在案例中只运行一次值赋值。它还为每个值更改运行POST请求(2次) }您不应该在reducer函数中执行副作用(如发出API请求)。副作用属于useffecthoo

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


}

您不应该在reducer函数中执行副作用(如发出API请求)。副作用属于
useffect
hook内部

您想做的可能是:

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的
useffect
钩子

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

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

当您将新值指定给
state.count时,您正在改变您的状态。在返回值之前显式地进行计数。有关增量的实现,请参阅文档:我正在尝试在switch语句的case中运行POST请求,以便在每次增量或减量时都向数据库发送POST。如果我将递增或递减放在return语句中,那么我将无法使用带有更新值的POST请求。我进行了编辑以回答这一点。我希望这能回答你的问题
useEffect(()=>{
    makeSideEffect()
}, [valueThatDecidesWhenToRerun])