父母重新渲染但它的孩子不会重新渲染的情况是什么?

IT技术 reactjs
2022-07-10 00:42:28

有人告诉我,如果父母的props发生变化,但如果父母的状态发生变化,孩子不会重新渲染。

在下面的例子中,当我点击按钮时,Child 重新渲染,这是有道理的,因为它的父级状态被触发了,但我不知道为什么 Grandchild 也会重新渲染!!它的父母的状态(孩子的状态)没有改变。

那么,这里的规则是什么?

会是什么情况:

1) 应用程序渲染但没有子和孙子渲染?

2)应用程序渲染但只有子渲染而不是孙子?

顺便说一句,我不是说如何使用 Memo 或 pureComponent,我只是想知道 React 是如何渲染嵌套子级的 :)

import React, { useState } from "react";

const App = () => {
  const [text, setText] = useState(0);
  return (
    <div style={{ padding: "50px" }}>
      <button onClick={() => setText(text + 1)}>add</button>
      {text}
      <Child />
    </div>
  );
};

const Child = () => {
  console.log("child");
  return (
    <div>
      <Grandchild />
    </div>
  );
};

const Grandchild = () => {
  console.log("Grandchild");
  return <div>:))</div>;
};

export default App;
1个回答

简而言之 - 如果父级重新渲染,SFC(无状态功能组件)总是重新渲染。

更改App组件中的状态会导致Child重新渲染。与 相同Grandchild,因为它的父级 ( Child) 已重新渲染。

但是,如果您将转换Child为一个类并使用React.PureComponent,它不会重新渲染,因为没有传入任何props(没有更改任何props或状态)。Grandchild也不会重新渲染。

PureComponent做一个浅的props比较,这将避免过度的重新渲染。

顺便说一句 - “我被告知如果父母的props发生变化,但如果父母的状态发生变化,孩子不会重新渲染。” - 这不是真的。即使父组件的状态发生变化,也可以避免重新渲染子组件。