当前位置: 首页 > 面试题库 >

功能组件中的shouldComponentUpdate

颜文康
2023-03-14
问题内容

我有一个关于React的问题shouldComponentUpdate(未覆盖时)。我确实更喜欢纯功能组件,但是即使prop /
state不变,我也担心它每次都会更新。所以我正在考虑使用PureComponent类。

我的问题是:功能组件shouldComponentUpdate是否与PureComponents 具有相同的检查?还是每次都会更新?


问题答案:

在React中,功能组件是无状态的,并且它们没有生命周期方法。 无状态组件是一种编写React组件的优雅方式,而我们的捆绑包中没有太多代码。
但是在内部,无状态组件被包装在一个类中,而目前没有进行任何优化。这意味着无状态组件和有状态组件在内部都具有相同的代码路径(尽管我们对它们的定义不同)。

但是在将来,React可能会优化无状态组件,如下所示:

将来,通过避免不必要的检查和内存分配,我们还将能够针对这些组件进行性能html" target="_blank">优化。[更多阅读…]

shouldComponentUpdate

您可以在此处应用我们的自定义优化,避免不必要的组件重新渲染。下面说明了此方法在不同类型的组件中的用法:

  • 功能性无状态组件

如前所述,无状态组件没有生命周期方法,因此我们无法使用进行优化shouldComponentUpdate。但是它们已经以不同的方式进行了优化,与具有所有生命周期挂钩的组件相比,它们具有更简单,更优雅的代码结构,并且字节数更少。

  • 扩展React.PureComponent

React v15.3.0开始 ,我们有了一个新的基类, PureComponent 以扩展为
PureRenderMixin
内置类。在引擎盖下,此方法将当前道具/状态与内的下一个道具/状态进行浅层比较shouldComponentUpdate

也就是说,我们仍然不能依靠PureComponent类来将组件优化到所需的水平。如果我们的道具具有Object类型(数组,日期,普通对象),则会发生这种异常情况。这是因为比较对象时我们遇到了这个问题:

    const obj1 = { id: 1 };
const obj2 = { id: 1 };
console.log(obj1 === obj2); // prints false

因此,浅浅的比较不足以确定情况是否已更改。但是PureComponent如果您的道具只是字符串,数字,布尔值..而不是对象,请使用class。如果您不想实现自己的自定义优化,也可以使用它。

  • 扩展React.Component

考虑上面的例子;如果我们知道对象已更改(如果对象id已更改),则可以通过比较来实现自己的自定义优化obj1.id === obj2.id。在这里我们可以使用extend普通的Component基类并shouldComponentUpdate用来自己对特定键进行比较。



 类似资料:
  • 问题内容: 我正在尝试将在这里找到的这个很棒的动画转换为React可重用的组件。看来此组件将需要一个父组件作为画布,而许多子组件则为。 出于性能方面的考虑,将它们变成无状态组件可能会更好,因为会有很多这样的组件。我不熟悉制作无状态组件,并且想知道应该在哪里定义和中定义的和函数。 无状态组件的功能是在组件内部还是外部?换句话说,以下哪个更好? 1: 2: 每种都有什么优点/缺点,其中哪一种对我的特定

  • 我写这个问题是因为我想请你帮助我如何在我的功能组件上使用redux。我查看了其他使用React组件的示例,但我不理解如何在功能组件中获得“存储”值。 我的想法是用我的 百货商店getState() 在我的功能组件中检查状态并与UI交互,但我无法实现。 需要帮忙吗? 例如,功能组件: 如何在标题组件中使用“存储”对象?它在我的应用程序组件上工作,只是我不知道如何在我的组件中使用它。 我的问题是: 我

  • 在不使用类的情况下,如何在react的功能性无状态组件中使用PropTypes?

  • 我正在使用一个名为React语义ui日期选择器的React模块,我相信它是基于React日期选择器的。不管怎样,这都是一个普通的问题。我的主类组件和日期选择器功能组件位于同一个文件中。日期选择器呈现并工作正常,但我不知道如何在主类组件中访问日期选择器的实际值。 代码的简化版本可以在下面看到,我只是控制台日志记录了几个变量的值。有人能给我一个建议,告诉我从类组件中访问所选日期选择器值的最佳方式吗?

  • 我目前有一个类组件和一个函数组件在我的主组件 以下是的代码段: 类组件 功能部件 因此,我想做的是通过按钮的onClick操作,从功能组件更改类组件的状态。我怎样才能完成任务?

  • 我有一个应用程序正在使用类组件开发react,我发现了一个功能的代码,我想添加到我的代码中,但它是使用功能组件制作的。代码在这里https://codesandbox.io/s/framer-motion-animate-in-view-gqcc8 但相关部分是这样的。 我不知道如何在我的类组件中添加那个控件变量 我应该把它添加到我的州吗?我不明白如何让它在类组件中工作