【问题标题】:Trying to get the state value after immediate state update立即状态更新后尝试获取状态值
【发布时间】:2020-07-15 21:29:17
【问题描述】:

我已经用usestate 声明了一个变量,如下所示

const [currentStepNumber, setCurrentStepNumber] = useState(0);

然后当我点击移动功能时,我正在更新状态,如下所示

const handleMove = () => {
   setCurrentStepNumber(currentStepNumber + 1);
   const { label } = Object.values(PROJECT_PHASE).find(s => s.stepNumber === currentStepNumber);
   const projectPhaseID = projectPhaseData.projectPhases.find(a => a.name === label).id;
   console.log(currentStepNumber);
   // need to do API call as well in move function 
};

而且currentStepNumber 仍然显示0 而不是仅1,我不能使用计时器来触发和更新值。有没有其他方法可以实现这一点?

我只需要在移动功能中更新currentStepNumber

【问题讨论】:

标签: javascript reactjs use-state


【解决方案1】:

或许可以试试useEffect:

useEffect(() => {
   const postStepData = async () => {
     try {
         // call the api
         const response = await postDataPromise({...data, currentStepNumber});
         setCurrentStepNumber(0);
         setSomeOtherState(false);
     } catch (e) {
         console.log(e)
     }
   }

   const { label } = Object.values(PROJECT_PHASE).find(s => s.stepNumber === currentStepNumber);
   const projectPhaseID = projectPhaseData.projectPhases.find(a => a.name === label).id;
   console.log(currentStepNumber);
   /*
    * as an example only call api on step 4
   */
   if (currentStepNumber === 4) {
      void postStepData();
   }
}, [currentStepNumber])

const handleMove = () => setCurrentStepNumber(currentStepNumber + 1);

参考:

【讨论】:

  • 感谢您的回复! ,我还需要进行 api 调用,然后在同一个 move 函数中获取 projectPhaseId .. 用你的代码我可以做到这一点
  • 嗯,我需要在当前步骤中调用 api,它自己不能等到第 4 步
  • @EnigmaState 可以去掉if 语句,只在每次状态更新时运行api调用?还是处理应该调用的情况?
  • 你的意思是说如果 currentStepNumber 有任何更新,useEffect 应该运行吗
  • @EnigmaState 是的
【解决方案2】:

您应该在React's useEffect 中使用新的currentStepNumber

const MyComponent = () => {
  const [currentStepNumber, setCurrentStepNumber] = useState(0);
  
  const handleMove = () => {
    setCurrentStepNumber(currentStepNumber + 1);
  };

  useEffect(() => {
    const { label } = Object.values(PROJECT_PHASE).find(s => s.stepNumber === currentStepNumber);
    const projectPhaseID = projectPhaseData.projectPhases.find(a => a.name === label).id;
    console.log(currentStepNumber);
  }, [currentStepNumber])

  return (
    <>{/* some jsx */}</>
  )
}

【讨论】:

  • 感谢您的回复,一旦我在 move 函数本身中获得了正确的 projectPhaseId,我也必须进行 api 调用..
猜你喜欢
  • 2019-11-15
  • 2018-10-28
  • 2018-07-25
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 2021-08-30
  • 2021-12-25
  • 2020-08-26
相关资源
最近更新 更多