【问题标题】:How does React.js re-render components?React.js 如何重新渲染组件?
【发布时间】:2021-02-06 13:08:32
【问题描述】:

我是新来的反应。我正在阅读他们的文档以了解 react 的工作原理。所以有人提到当 state/props/setState() 改变/调用时,react 会重新渲染整个组件。

另外,我读到 react 元素是不可变的,只有在发生变化时才会呈现。因此,当 react 尝试渲染一个组件时,它实际上会遍历所有元素,检查差异并仅渲染那些数据已更改的元素。它不会简单地重新渲染整个组件。

我在这方面是对的吗?还是我的理解有误?

【问题讨论】:

  • 是的!你是对的。

标签: reactjs


【解决方案1】:

你是对的,当 props 或 state 改变时 react 会重新渲染组件。 话虽这么说,当子组件收到新的 props 时,当你使用 React.Component 时,react 不会检查 props 是否发生变化,即使你再次传递相同的 props,它也会重新渲染。

为了使组件仅在收到不同的 props 时呈现,您可以在类组件的情况下使用React.PureComponent,或者在功能组件的情况下使用React.memo() 包装组件。

【讨论】:

    【解决方案2】:

    我读到 React 元素是不可变的,它们只有在发生变化时才会呈现。

    说 React 元素是不可变的是不正确的,你需要将它们视为不可变,尤其是组件的state and props

    因此,当 React 尝试渲染组件时,它实际上会遍历所有元素,检查差异并仅渲染那些数据已更改的元素。

    默认行为是渲染所有子树,当通过调用setState(触发组件子树上的协调)重新渲染父级时。

    所以说它会在“数据更改”时渲染组件是不正确的,默认情况下它们无论如何都会重新渲染,即使“数据”没有改变。

    我们所说的“数据已更改”是指 props 更改(默认情况下进行浅比较,使用 memoization 进行更改)。

    我们可以使用key prop 来帮助进行对账。

    【讨论】:

      【解决方案3】:

      我认为总结 React 组件何时重新渲染的更清晰的方法是:

      React 组件何时且仅在以下情况下重新渲染:

      1. 他们的状态改变(通过setState()useState()
      2. 他们被传递了新的道具;
      3. 它们的父组件重新渲染。

      注意事项:

      • 您必须正确更新状态才能重新渲染组件,即通过setState()useState()。如果通过其他“非法”方式改变状态,例如直接访问状态,React 不会注意到,也不会重新渲染组件。

      • React props 是只读的,所以当我们说“当组件的 props 发生变化时”,我们真正的意思是当组件 通过 props 的值发生变化时。 props 不应该在组件内发生变化。

      • 如果你使用useMemo()React.memo(),那么只有当父组件接收到的props发生变化时,子组件才会重新渲染。

      • 区分重新渲染虚拟 DOM 和更新实际 DOM 很重要。仅仅因为一个组件重新渲染并不意味着它更新了 DOM。当一个组件重新渲染时,React 将新版本与之前的版本进行比较,并且仅在发生更改时更新实际 DOM 12

      【讨论】:

        【解决方案4】:

        没有什么比 A. Sidorenko 的 cheat sheet 更让我明白这一点了。

        编辑: 基本上是的,任何状态更改都会触发重新渲染。这包括启动状态更改的组件及其所有子组件。例如,如果你的作文是:

        A > B > C

        如果 A 的状态已更新,则 A、B 和 C 将重新渲染。有一些方法可以防止重新渲染子组件(例如 memo、useMemo),所以我向您指出上面提到的备忘单以获取完整的详细信息。

        【讨论】:

        • 嗨 PetErr。您也愿意在这里分享解决该问题的见解吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-26
        • 1970-01-01
        • 2018-03-03
        • 2016-06-28
        • 2020-02-13
        • 1970-01-01
        • 2020-09-29
        相关资源
        最近更新 更多