关于React Hooks中useEffect与useState运行机制的疑问
React useEffect与状态更新触发渲染的疑问解答
你的理解完全正确,核心逻辑就是:React中,useState返回的状态更新函数,只有当传入的新状态值与当前状态值经过浅比较后不相等时,才会触发组件重新渲染。下面结合你的两个示例具体解释:
示例1分析
初始状态loaded为false:
- 组件第一次渲染,执行
useEffect,打印sumit并发起fetch请求。 - fetch请求完成后,调用
setLoaded(true),新值true与当前状态false浅比较不相等,触发组件第二次渲染。 - 第二次渲染后再次执行
useEffect,fetch完成后再次调用setLoaded(true),此时新值true与当前状态true浅比较相等,React不会触发第三次渲染,因此useEffect总共只执行了两次。
示例2分析
初始状态name为sumit:
- 组件第一次渲染,执行
useEffect,调用setName(Math.random()),Math.random()生成的随机数与当前name的字符串值完全不同,触发第二次渲染。 - 第二次渲染后再次执行
useEffect,再次调用setName(Math.random()),新生成的随机数又和当前name的随机值不同,再次触发渲染。 - 这个过程无限重复,就形成了无限循环。
学习资源推荐
- React官方文档:重点查看「状态更新的行为」和「useEffect的触发条件」相关内容,官方文档里明确说明了状态更新的浅比较逻辑,聚焦到状态更新的细节部分就能找到对应内容。
- 《React Hooks 权威指南》:这本书详细拆解了每个Hook的运行机制,包括状态更新与重渲染的关联逻辑,适合系统学习。
- React官方社区的Hooks讨论帖:很多资深开发者会分享实际场景中的Hook触发问题,能帮你理解更多边界情况。
内容的提问来源于stack exchange,提问作者Sumit Rai
相关产品推荐
相关产品推荐

