为什么(记忆化的)子组件会重新渲染?

Why is the (memoized) child component re-rendering?

我有两个 React 功能组件:C1C2C2 嵌套在 C1:

const C2 = () => {
  console.log("C2 Render");
  return (
    <div>I am Component 2</div>
  );
};

const C1 = () => {
  const [text, setText] = useState("Hello");
  const MC2 = React.memo(C2, () => true);
  
  return (
    <div className="box">
      <h1>The Button</h1>  
      <button
        onClick={() => {
          setText(`${text} b`);
        }}
        className="button">
          Click me
       </button>
      <div>
        {text}
      </div>
      <MC2 />
    </div>
  );
}

CodePen here.

问题

我知道一个组件在不同情况下会被重新渲染。其中包括父级重新渲染时的那个。

这就是我在 C2 周围使用记忆组件的原因。但每次单击按钮时,我仍然可以看到控制台显示 "C2 Render"

为什么?

C1 由于状态变化而重新渲染,所以你的记忆组件每次都重新声明。 只需将 C2 包装在 React.memo() 中,您将看不到重新渲染

const MC2 = React.memo(() => {
  console.log("C2 Render");
  return (
    <div>I am Component 2</div>
  );
}, () => true);

或者如果您只想记忆一个用例,请将其放在 C1 组件之外并记忆该组件:

const C2 = () => {
  console.log("C2 Render");
  return (
    <div>I am Component 2</div>
  );
};

const MC2 = React.memo(C2, () => true);

& 像这样使用它:

const C1 = () => {
  const [text, setText] = useState("Hello");
  
  return (
    <div className="box">
      <h1>The Button</h1>  
      <button
        onClick={() => {
          setText(`${text} b`);
        }}
        className="button">
          Click me
       </button>
      <div>
        {text}
      </div>
      <MC2 />
    </div>
  );
}