标签导航:

react函数组件usestate钩子:为什么第二次点击仍然触发渲染?

深入剖析React函数组件useState钩子的渲染行为

本文分析一个关于React函数组件useState钩子渲染行为的疑问。代码中,按钮点击更新状态,但控制台输出结果与预期不符。让我们分析以下代码:

function A() {
  console.log(2);
  return null;
}

const App: React.FC = () => {
  const [flag, setFlag] = useState(false);
  console.log(1);
  return (
    <div onClick={() => {
          console.log("click");
          setFlag(true);
        }}>
      click me
      <A />
    </div>
  );
};

第一次点击,控制台输出click 1 2;第二次输出click 1;第三次及以后,只输出click。 为什么第二次点击还输出1?

问题并非useState的newValue === prevValue判断逻辑错误。useState的更新并非严格同步,而是涉及React的异步更新和批量更新机制。

第一次点击,setFlag(true)触发更新,导致组件重新渲染,输出1和2。第二次点击,尽管flag已为true,但console.log(1)可能在更新之前执行。这是React运行时环境的调度行为,并非useState的逻辑缺陷。

为了更深入理解,需要研究React的异步更新机制和批量更新机制,以及“eager state”概念。这些概念解释了React如何优化更新流程,以及在某些情况下,即使状态值不变,也可能触发重新渲染。理解这些细节有助于编写更高效、更稳定的React应用。