gpt4 book ai didi

javascript - 为什么我需要 setTimeout 来更新 React 组件中的状态

转载 作者:行者123 更新时间:2023-12-01 00:04:21 29 4
gpt4 key购买 nike

为什么我需要在 React 组件中用 setTimeout 包装 setValue?

这有效

<Button onClick={() => acceptOne()}>
set value with setTimeout
</Button>

const acceptOne = () => {
setTimeout(() => {
setEditMode(false);
});
};

这不...

<Button onClick={() => acceptTwo()}>
set value without setTimeout
</Button>

const acceptTwo = () => {
setEditMode(false);
};

这是一个CodeSandbox example获取演示该问题的完整代码。

我是 React 新手,已经不得不使用 setTimout 来让状态像这样改变。我觉得这很可能是初学者的事情,并且有一些 React 特定的事情我还不明白。这是怎么回事,为什么当我不使用 setTimeout 时 setValue 不起作用?

最佳答案

这是由于事件传播而发生的。如您所见,您已将一个事件绑定(bind)到父 div。因此,每当您单击按钮时,父 div 的事件也会执行

Why it works with setTimeout?

因为它在div事件之后执行,因为它被推送到其他异步进程并且需要时间来执行。

您可以添加 event.stopPropagation() 来阻止事件在 DOM 中冒泡:

  const acceptOne = e => {
e.stopPropagation();
setEditMode(!editMode);
};

const acceptTwo = e => {
e.stopPropagation();
setEditMode(!editMode);
};

现在将事件更改为:

onClick={acceptOne}
onClick={acceptTwo}

或者:

onClick={e => acceptOne(e)}
onClick={e => acceptTwo(e)}

Updated codesandbox

关于javascript - 为什么我需要 setTimeout 来更新 React 组件中的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60489033/

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