You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中useEffect搭配setInterval计数到100不停止问题如何解决

问题根源

代码问题出在闭包捕获特性:由于useEffect的依赖数组为空,该Effect仅会在组件首次挂载时执行一次,回调里捕获的progress永远是首次渲染时的初始值(一般为0),所以progress === 100的判断条件永远无法触发,interval定时器不会被正常清除,计数就会一直上涨。

修复方法

直接将停止判断放在setProgress的函数式更新回调中即可,这里可以拿到最新的进度值:

useEffect(() => {
    const interval = setInterval(() => {
        setProgress((prevProgress) => {
            const nextProgress = prevProgress + 1;
            // 拿到最新值后判断是否停止
            if (nextProgress === 100) {
                clearInterval(interval);
            }
            return nextProgress;
        });
    }, 16);
    return () => clearInterval(interval);
}, []);
console.log(progress);

也可以选择把progress加入useEffect的依赖数组实现需求,但这种方案每次进度更新都会销毁旧定时器再创建新定时器,性能比上述方案差,不推荐使用。

内容的提问来源于stack exchange,提问作者strangeQuirks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:48:00