React中的纯类组件和常规类组件有什么区别?

时间:2018-10-24 04:28:32

标签: javascript reactjs

我试图了解何时使用React pure组件以及何时使用  使用常规组件。 我有一个简单的问题。

在相同的道具和相同的状态下,组件如何呈现不同的结果?

如何定义道具对象浅层比较的界限? 我没有在道具中使用嵌套属性,但是我应该始终使用纯组件吗?

下面的引言说,当父母是纯孩子时,也不会重新渲染所有子孩子组件,我们理解并确保了这一点,但这是否还意味着我们必须将孩子包裹在纯孩子组件中,否则它们可以作为常规孩子组件使用吗?

  

此外,React.PureComponent的shouldComponentUpdate()会跳过整个组件子树的道具更新。确保所有子组件也都是“纯”的。

最后一句是……在官方文档中的以下引言意味着我们无法访问常规组件中的shouldComponentUpdate()?

  

React.Component没有实现shouldComponentUpdate(),但是React.PureComponent通过浅层的道具和状态比较来实现它。

2 个答案:

答案 0 :(得分:0)

React中有两种主要类型的组件。类组件和功能组件。

类组件是ES6类,而功能组件是函数。

功能组件的唯一约束是接受props作为参数并返回有效的JSX。

您可以随意使用功能组件。但是,当您确实需要使用组件生命周期方法时,则需要将其重构为类级别的组件。

请看看这个link

答案 1 :(得分:0)

  

在相同的道具和相同的条件下,组件如何呈现不同的结果   状态,例如?

在相同的道具和相同的状态下(如果您未使用旧版上下文API),组件将不会呈现不同的结果。这就是使用PureComponent的原因,因为在给定相同的Props和Same状态的情况下,该组件无需经历另一个渲染周期,在该周期中它比较其props和state并最终决定不进行任何更改。这是计算的浪费,因此使用PureComponent可以通过在Props和State级别添加另一个比较来阻止这种比较。

  

如何定义道具对象浅层比较的界限?我没有   在props中使用了嵌套属性,但我应该始终使用pure   组件?

如果您的所有Props都是高度嵌套的,那么,如果在数据内未正确执行更新(未克隆和更改对象),则浅表比较可能会给您带来负面的负面印象。浅比较将对道具和状态执行一级检查。

您必须决定是否使用PureComponent的点是基于对是否使用的理解,这种情况经常发生,从而触发了组件渲染方法,但无需进行任何更改。如果道具和状态频繁变化,并且仅在极少数情况下组件会使用相同的道具和状态进行渲染,则您无需使用PureComponent,因为这会增加道具和状态比较的额外复杂性,并且总是返回{{ 1}}进行更改。

使用不可变数据将有助于快速进行浅层比较检查,因为引用更改意味着值更改,而不可变数据可确保您不直接更改值。

  

这是否也意味着我们必须将孩子包装成纯组分或   它们可以用作常规组件

在创建PureComponent时,您需要确保的所有子项也都是Pure,并且如果嵌套的组件满足上述有关何时创建PureComponent的说明,那么您可以将它们编写为PureComponent本身。