gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:48:49 25 4
gpt4 key购买 nike

我试图在提交表单后显示加载程序 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com