React意外地保留了由React.useState(...)生成的变量的旧值。我按下按钮1,然后按2。3000毫秒后,我希望在警报消息中看到"null"
,但仍然看到"42"
。将handleDisplay
封装到依赖于[val]
的React.useCallback
中无济于事。
function App() {
const [val, setVal] = React.useState(42)
const handleHide = () => {
setVal(null)
}
const handleDisplay = () => {
setTimeout(() => {
alert(val)
}, 3000)
}
return (
<div>
<p>VAL: {val ? val : 'null'}</p>
<button onClick={handleDisplay}>[1] display value with delay</button>
<button onClick={handleHide}>[2] hide immediately</button>
</div>
)
}
同时,页面上的值(通过VAL: { val ? val : 'null' }
呈现)是正确的,它如预期的那样是"null"
。关于我做错了什么,以及如何在我的alert(...)
中获取"null"
附注:这里是一个沙箱,其中包含一个实时示例https://codesandbox.io/s/react-usestate-bug-24ijj
发布于 2021-04-07 18:32:43
在第一次渲染时,val只是一个值为42的常量数字,永远不会更改。这是单击按钮1时传递给setTimeout的值。在3秒内单击按钮2将导致新渲染,其中val的新实例具有值null,但这不会影响第一次渲染中绑定的值。您可能希望阅读有关useEffect钩子的内容。丹·阿布拉莫夫在这里有一篇很棒但很长的文章,只提到了这个问题:https://overreacted.io/a-complete-guide-to-useeffect/
https://stackoverflow.com/questions/66991645
复制相似问题