javascript - setTimeout 中的 setState 返回令人困惑的结果

标签 javascript reactjs react-functional-component use-state

我试图在提交表单后显示加载程序 1.5 秒,然后停止加载程序并提交表单。 所以我设置了一个状态变量isSubmitting:

  const [isSubmitting, setIsSubmitting] = useState(false);

isSubmitting 默认情况下为 false,提交后,我将其设置为 true,之后我设置了超时以将其设置回来为。但不知何故,它不会被设置回 false 请参阅注释代码

const onSubmit = (e) => {
    e.preventDefault();
    setIsSubmitting(!isSubmitting);
    setTimeout(() => {
      createProfile(formData, history, edit);
      console.log(isSubmitting);// false - why?? its been set to true before the timeoute
      setIsSubmitting(!isSubmitting);
      console.log(isSubmitting);// false - if the previous log was false, this should of been true
    }, 1500);
  };
console.log(isSubmitting) // true - ??? it did not get set back to false

最佳答案

使用useState钩子(Hook)提供的更新器进行状态更新是异步的,并且不会立即反射(reflect)更新的更改。

console.log(isSubmitting); // false
setIsSubmitting(!isSubmitting);
console.log(isSubmitting); // false

相反,你应该使用Effect,

const onSubmit = (e) => {
    e.preventDefault();
    setIsSubmitting(!isSubmitting);
  };

useEffect(() => {
    // action on update of isSubmitting
  if(isSubmitting) {
    setTimeout(() => {
      createProfile(formData, history, edit);
      setIsSubmitting(!isSubmitting);
    }, 1500);
  }
}, [isSubmitting]);

关于javascript - setTimeout 中的 setState 返回令人困惑的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61666548/

相关文章:

javascript - 尝试使用 useEffect Hook 来实现此功能

javascript - React Functional Component - 在哪里存储从 Prop 计算的转换值

reactjs - useEffect 每次都会执行,即使依赖关系没有改变

reactjs - React Native - 在功能组件中创建方法并在组件外部调用此方法,可能吗?

javascript - 将 redux store 实现为函数而不是类的原因是什么?

reactjs - React Router 在重定向中包装多个路由

react-hooks - 当状态对象设置为未定义时,输入值未更新

javascript - 自定义 JS 提示弹窗

javascript - 来自 Ajax 响应的数据无法加载到 HighChart 中

javascript - mmenu 不工作,看起来像普通的 html