reactjs - 用反应创建计时器
问题描述
我想要一个倒数计时器,当程序阶段达到两个时,它从 60 计数到零。这是我的代码:
const [timer, setTimer] = useState(60)
useEffect(() => {
if (stage === 2) {
const interval = setInterval(() => {
console.log(timer)
setTimer(timer - 1)
if (timer === 1) {
clearInterval(interval)
}
}, 1000)
}
}, [stage])
我有一个像下面这样的 div 只显示计数器值
<div>{timer}</div>
在我的 setInterval 中,当我使用console.log(timer)
它时,它总是打印出 60。但在 div 内部,该值以 60 开头,下一秒将始终为 59。我在这里做错了什么?
解决方案
出于同样的原因,您应该有另一个useEffect
用于取消间隔:
const intervalId = useRef();
useEffect(() => {
if (stage === 2) {
intervalId.current = setInterval(() => {
setTimer((prevTimer) => prevTimer - 1);
}, 1000);
}
}, [stage]);
useEffect(() => {
console.log(timer);
if (timer === 1) {
clearInterval(intervalId.current);
}
}, [timer]);
检查类似的问题:setInterval
counter common errors。
推荐阅读
- reactjs - 在反应管理列表中按不同或多个来源过滤
- r - 如何迭代我的向量中的所有元素以进行反距离加权
- datetime - 如何在飞镖中使用频率分割两次?
- python - 多索引 DF 的 Python 数据框相关系数
- azure - az aks 无所事事地制造挂起
- c# - 是否可以在 asp.net 5.0 应用程序中使用 DataContractJsonSerializer 进行 json 序列化?
- r - 使用 for 循环抓取 Zillow
- flutter - 如何在 Flutter 中等待来自 WillPopScope 函数的异步 bloc 事件
- laravel - laravel 缓存返回 0
- javascript - GeolocationCoordinates.speed API 的准确性和可靠性如何?