【发布时间】:2021-10-21 10:21:00
【问题描述】:
首先,我无法找出这段代码中的问题。但这个问题可能在这里占有一席之地。
据我了解,问题可能是单击按钮后计数器值未更新。单击按钮时,警报会显示该值,尽管在 2.5 秒的延迟期间,我单击并增加了计数器的值。
我说得对吗?如果是的话,这里应该修复或添加什么?
import React, { useState } from 'react'
function Root() {
const [count, setCount] = useState(0)
function handleAlertClick() {
setTimeout(() => {
alert(`You clicked ${count} times`)
}, 2500)
}
return (
<Container>
<Column>
<h4>Closures</h4>
<p>You clicked {count} times</p>
<button type="button" onClick={() => setCount(counter => counter + 1)}>
Click me
</button>
<button type="button" onClick={handleAlertClick}>
Show alert
</button>
</Column>
</Container>
)
}
export default Root
【问题讨论】:
-
“据我了解,问题可能是点击按钮后计数器值没有更新。” 是和否。
counter已更新,但setTimeout已被调用,因此引用“旧”counter变量。使用 refs 是解决此问题的一种简单方法。 -
这可能有助于更好地理解闭包:JavaScript closure inside loops – simple practical example。使用 React 组件的情况与使用循环的情况非常相似。每次重新渲染基本上都是一个新的迭代。
标签: javascript reactjs asynchronous settimeout