React.Component与React.PureComponent


224

官方阵营文档状态“ React.PureComponentshouldComponentUpdate()只有比较浅的对象”,并建议针对这一点,如果状态是‘深’。

鉴于此,React.PureComponent在创建React组件时,为什么有人应该偏爱它?

问题

  • React.Component我们可能会考虑使用对性能有什么影响React.PureComponent
  • 我猜 shouldComponentUpdate()PureComponent执行只有浅薄的比较。如果是这种情况,难道不能将所述方法用于更深入的比较吗?
  • “此外,React.PureComponentshouldComponentUpdate()跳过整个组件子树的道具更新”-这是否意味着道具更改被忽略了?

如果有帮助的话,阅读该媒体博客会引起疑问。


5
我知道
MrOBrian

Answers:


282

之间的主要区别React.PureComponent,并React.ComponentPureComponent做一个浅浅的比较上的状态变化。这意味着在比较标量值时,它会比较它们的值,但是在比较对象时,它只会比较引用。它有助于提高应用程序的性能。

React.PureComponent可以满足以下任何条件。

  • 状态/道具应该是不可变的对象
  • 状态/道具不应具有层次结构
  • forceUpdate数据更改时您应该致电

如果您正在使用React.PureComponent,则应确保所有子组件也都是纯组件。

我们可以考虑将React.PureComponent用于React.component会对性能产生任何影响?

是的,它将提高您的应用程序性能(由于比较浅)

我猜Purecomponent的shouldComponentUpdate()只执行浅比较。如果是这种情况,该方法不能用于更深入的比较吗?

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

“此外,React.PureComponent的shouldComponentUpdate()会跳过整个组件子树的属性更新”-这是否意味着属性更改会被忽略?

是的,如果在浅层比较中找不到区别,则道具更改将被忽略。


1
嗨@VimalrajSankar。感谢您的帮助。能否请您给下面的语句的例子: It means that when comparing scalar values it compares their values, but when comparing objects it compares only references. It helps to improve the performance of the app.?谢谢
Ishan Patel '18

1
@ Mr.Script我希望这将对stackoverflow.com/a/957602/2557900
vimal1083 '18

3
State/Props should not have a hierarchy抱歉,您能否解释一下层次结构的含义?
桑尼·刘

1
@SanyLiew表示状态和道具只能包含数字和字符串之类的原始值,而不能包含对象(层次结构)中的对象。
jedmao

3
如果state / props是不可变的对象,那么只要具有层次结构并且仍然使用PureComponent,就可以了,只要这些层次结构也保持不可变的对象,对不对?
Sany Liew,

38

ComponentPureComponent有一个区别

PureComponent与它完全一样,Component只是它shouldComponentUpdate为您处理方法。

当道具或状态发生变化时,PureComponent将对道具和状态进行浅浅的比较Component另一方面,开箱即用时不会比较当前道具和状态。因此,无论何时shouldComponentUpdate调用,组件都会默认重新渲染。

浅比较

当比较先前的道具和状态与下一个道具时,浅表比较将检查基元具有相同的值(例如1等于1或true等于true),并且在更复杂的javascript值(例如对象和数组)之间引用相同。

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


React.Component =>所以如果我用相同的道具多次渲染相同的组件。它将触发它是孩子的​​渲染。无论道具是否更改
Ehsan sarshar

23

正如我所看到的,主要区别在于,组件每次其父组件重新发布时都会重新发布,而不管该组件的道具和状态是否已更改。

另一方面,如果纯组件的父级重新渲染,则纯组件不会重新渲染,除非纯组件的属性(或状态)已更改。

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

当父母的道具以仅改变一个孩子的道具的方式改变时,则:

  • 如果所有组件都是常规组件,则整个组件树将重新呈现
  • 如果所有子孙都是纯组件,则只有一个孩子会退任,其子孙中的一个或全部将退还,这取决于他们的道具是否被更改。如果此组件树中有很多组件,则可能意味着性能上的显着提高。

但是,有时使用纯组件不会产生任何影响。当父母从redux商店收到道具时,需要对孩子的道具进行复杂的计算时,我遇到了这样的情况。父母使用平面清单来呈现其子代。

结果是,每当redux存储区进行很小的更改时,都会重新计算儿童数据的整个平面列表。这意味着对于树中的每个组件,道具都是新对象,即使其值不变。

在这种情况下,纯组件无济于事,并且如果需要重新渲染,则只能通过使用常规组件并在shouldComponentUpdate中检入子代来实现性能提升。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.