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

为何React组件传入相同state值时第二次点击仍重渲染,第三次却跳过?

React useState 重复 setState 相同值的渲染行为解析

代码片段

import { useState } from "react";

function App() {
  const [state, setState] = useState(0);

  return (
    <>
      {console.log("rendered...", state)}
      <button onClick={() => setState(1)}> Change </button>
    </>
  );
}

export default App;

运行输出

  • 启动时:rendered...0
  • 第一次点击:rendered...1
  • 第二次点击:rendered...1
  • 第三次点击:(无输出)

原因解析

核心是React的状态更新优化逻辑在起作用:

  • 第二次点击仍触发渲染的原因:
    第一次点击后状态从0变为1,组件完成渲染,React记录当前状态为1。第二次点击setState(1)时,React会先启动渲染流程,在渲染过程中才会对比新状态与当前状态是否一致。虽然最终发现值相同不会更新DOM,但渲染流程已经执行,所以console会输出rendered...1。

  • 第三次点击跳过重渲染的原因:
    第二次点击的相同值更新处理完成后,React会缓存这个「重复值更新」的记录。第三次点击时,React会在触发渲染流程前直接检测到:要设置的状态值和当前状态完全一致,且已有过相同的更新记录,于是直接跳过整个渲染流程,也就不会有console输出了。

本质是React的渐进式优化——第一次重复更新会走完整渲染流程(但跳过DOM更新),后续完全相同的更新则直接拦截,避免不必要的计算开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 14:04:56