我正在构建一个秒表 UI,以秒为单位显示时间。单击按钮,计时器将开始向上计数,并在再次单击时停止。用户应该能够再次启动它。
我遇到的问题是我可以setInterval
正常工作,但是一旦我包含setTime
钩子,组件就会更新以在 UI 中呈现时间,但是setInterval
实例会被多次调用。这会导致奇怪的渲染行为。
const Timer = () => {
const [time, setTime] = useState(0)
let timer
const startStopTimer = () => {
if (!timer) timer = setInterval(() => setTime(time++), 1000)
else {
clearInterval(timer)
timer = null
}
}
return (
<div>
<p>Time: {time} seconds</p>
<Button
onClick={() => {
startStopTimer()
}
> Start/Stop </Button>
</div>
)
}
示例行为是:
- 用户点击开始/停止
- 定时器从 0 开始向上计数
- 用户点击开始/停止
- 计时器立即停止
- 用户点击开始/停止
- 计时器从停止的地方继续