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

React代码未修改state值却触发无限循环的原因

为什么React中setState返回相同值仍触发无限重渲染?

问题核心原因

你遇到的无限重循环,本质是在组件渲染阶段直接调用setState导致的:

  • 组件每次渲染时,函数体中的所有代码都会执行,包括setState((prev)=>7)。
  • 第一次渲染时,state初始值为0,调用setState后将其改为7,触发重渲染。
  • 第二次渲染时,state已经是7,此时调用setState返回的新值还是7,看似和旧值相同,但因为是在渲染阶段触发的状态更新,React会安排下一次渲染;而新的渲染又会再次执行setState,形成无限循环。

对React状态更新逻辑的误解

你以为“state值不变就不会触发重渲染”,这个认知有前提:状态更新的触发时机不能在渲染阶段。

  • 当在事件回调、useEffect等非渲染阶段调用setState时,React会浅比较新旧值,若相等则跳过更新和重渲染。
  • 但在渲染阶段调用setState时,React无法同步判断新值是否和旧值相等,它会先触发重渲染,等到渲染完成后再检查值是否变化——但此时下一次渲染已经再次执行了setState,循环无法终止。

解决方案

将setState移到非渲染阶段执行,比如用useEffect并设置空依赖数组,让它只在组件挂载时执行一次:

import React, { useState, useEffect } from 'react'
import logo from './logo.svg'
import './App.css'

function App() {
    const [state, setState] = useState(0)
    console.log(state)

    useEffect(() => {
        // 仅在组件挂载时执行一次setState
        setState((prev) => 7)
    }, [])

    return (
        <div className="App">
            <header className="App-header">
                <img src={logo} className="App-logo" alt="logo" />
                <p>
                    Edit <code>src/App.jsx</code> and save to reload!
                </p>
                <span className="App-link">Hello from codedamn :)</span>
            </header>
        </div>
    )
}

export default App

这样修改后,setState只会执行一次,将state改为7后不再触发后续的状态更新,组件也就不会无限重渲染了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:22:24