反应。组件vs React。PureComponent

官方的反应文档声明“React.PureComponentshouldComponentUpdate()仅浅层比较对象”,如果状态为“深”,则建议不要这样做。

鉴于此,在创建React组件时,有什么理由应该选择React.PureComponent呢?

问题:

  • 使用React.Component是否有任何性能影响,我们可以考虑使用React.PureComponent?
  • 我猜PureComponentshouldComponentUpdate()只执行浅比较。如果是这样的话,难道该方法不能用于更深入的比较吗?
  • “此外,React.PureComponentshouldComponentUpdate()跳过整个组件子树的道具更新”-这是否意味着道具更改被忽略?

如果有帮助的话,从这个媒介的博客中读取问题就产生了。

119845 次浏览

React.PureComponentReact.Component之间的主要区别是PureComponent对状态更改执行浅的比较。这意味着在比较标量值时,它比较它们的值,但在比较对象时,它只比较引用。它有助于提高应用程序的性能。

当你可以满足以下任何条件时,你应该选择React.PureComponent

  • State/Props应该是一个不可变的对象
  • 状态/道具不应该有层次结构
  • 当数据发生变化时,应该调用forceUpdate

如果你正在使用React.PureComponent,你应该确保所有的子组件也是纯的。

在使用React.component时是否有任何性能影响 考虑使用React.PureComponent?< / p >

是的,它会提高你的应用程序的性能(因为简单的比较)

我猜Purecomponent的shouldComponentUpdate()只执行 肤浅的比较。如果是这种情况,就不能用上述方法了 为了更深入的比较?< / p >

你猜对了。如果你满足我上面提到的任何一个条件,你就可以使用它。

< p > "此外,反应。PureComponent的shouldComponentUpdate()跳过道具 更新整个组件子树”-这是否意味着道具 更改被忽略?< / p >

是的,如果在浅比较中找不到差异,道具变化将被忽略。

ComponentPureComponent有一个区别

PureComponentComponent完全相同,除了它为你处理shouldComponentUpdate方法。

当道具或状态发生变化时,PureComponent将同时对道具和状态执行< >强浅比较< / >强。另一方面,Component不会将当前道具和状态与下一个道具进行比较。因此,每当调用shouldComponentUpdate时,组件将默认地重新呈现。

浅的比较

在比较前一个道具和状态和下一个状态时,简单的比较将检查原语是否具有相同的值(例如,1等于1或true等于true),以及在更复杂的javascript值(如对象和数组)之间的引用是否相同。

来源:https://codeburst.io/when-to-use-component-or-purecomponent-a60cfad01a81

在我看来,主要的区别在于,每当它的父组件重新呈现时,组件都会重新呈现,而不管组件的道具和状态是否发生了变化。

另一方面,如果其父组件呈现,纯组件将不会呈现,除非纯组件的道具(或状态)已经更改。

例如,假设我们有一个具有三级层次结构的组件树:父级、子级和子级。

当父节点的道具以只改变一个子节点道具的方式改变时,则:

  • 如果所有的组件都是规则组件,那么整个组件树将被渲染
  • 如果所有的子组件和孙子组件都是纯组件,那么只有一个子组件和它的一个或所有孙子组件会被渲染,这取决于它们的道具是否被改变了。 如果这个组件树中有很多组件,这可能意味着性能有显著提升。李< / >

然而,有时使用纯组件不会产生任何影响。我曾经遇到过这样的情况,当父节点从redux商店收到它的道具时,需要对它的子节点道具执行复杂的计算。父进程使用平面列表来呈现子进程。

结果是,每当redux存储中有一个很小的变化时,整个子数据的平面数组都要重新计算。这意味着对于树中的每个组件,道具都是新的对象,即使值没有改变。

在这种情况下,纯组件不起作用,只有通过使用常规组件并在shouldComponentUpdate中检入子组件(如果需要重新渲染器)才能实现性能提升。

我认为PureComponent比Regular Component更有效。事实上,你不需要写太多的代码,它会为你处理shouldComponentUpdate()方法。