为何React中useState传入相同值仍触发重渲染并报错?
为什么传入相同状态值仍会触发无限重渲染?
你说的没错,React确实会在useState的setter传入和当前状态严格相等的原始值时,跳过后续的组件更新。但你遇到的无限循环问题,核心原因不是“相同值触发了重渲染”,而是你在组件的顶层渲染逻辑里直接调用了setter。
具体过程拆解:
- 组件第一次渲染时,执行到
setMyState(false),不管这个值和当前状态是否一样,React都会立即触发新一轮渲染流程(这是渲染期间调用setter的固有行为)。 - 等到React进入更新阶段,才会检查新值和旧值是否相等,发现都是
false,于是跳过组件的实际更新。但此时第二次渲染已经启动了,第二次渲染又会执行setMyState(false),再次触发渲染请求。 - 这个循环会一直重复,直到React触发“Too many re-renders”的保护机制。
为什么用useEffect就没问题?
当你把setMyState(false)放到useEffect里时,useEffect的回调是在渲染完成后执行的。此时调用setter,React会先检查新值和旧值是否相等,发现没变化就不会触发新的渲染,自然不会形成循环。
总结
不是相同值触发了重渲染,而是你在渲染过程中直接调用setter的行为,强制React不断启动新的渲染流程,哪怕后续会跳过更新,也架不住循环启动的速度。
内容的提问来源于stack exchange,提问作者moomoo
相关产品推荐
相关产品推荐

