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

useEffect内执行同步重任务是否会阻塞React UI更新?

useEffect中的同步重任务是否会阻塞UI?

我了解到useEffect会在UI更新后执行,但在组件挂载或更新count状态时,UI更新需要耗时。请问在useEffect中执行如下同步重任务是否会阻塞UI?

export const UseState = () => { 
    const [count , setCount] = useState(0)
    useEffect(()=>{
        let y=1;
        for (let i=0;i<500000000;i++){
            y=y+1;
        }
    },[count]);
    
    return (
        <div>
            <button onClick={()=>setCount(c => c+1)}> Count - {count}</button>
        </div>
    )
}

会阻塞UI,核心原因是JavaScript的单线程模型:React渲染、useEffect执行、浏览器处理用户交互与页面渲染,全都共用同一个主线程,同一时间只能处理一件事。

虽说useEffect确实是在UI更新完成后才触发,但你写的这个循环是同步且极耗时的任务。它一旦开始运行,就会完全霸占主线程——在循环结束前,浏览器没法响应任何操作:再点按钮没反应、页面其他交互卡死,严重时浏览器还会弹出“页面无响应”的提示。

哪怕UI更新本身需要耗时,useEffect里的同步重任务也会在UI更新完成后立刻抢占主线程,导致后续所有依赖主线程的操作被阻塞。

要避免这种问题,你可以把这类重任务放到Web Worker中处理(Worker运行在独立线程,不会占用主线程);或者用setTimeout把大任务拆成多个小任务,给主线程留出处理其他操作的间隙。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:12:34