Angular 2是否具有重新渲染优化功能?

时间:2016-04-24 17:09:29

标签: javascript angular angular2-template

我几个月来一直在使用React,React并不是完全重新渲染组件而是找到差异并进行更改。 Angular 2会做这样的事吗?

每当检测到状态发生变化时,Angular 2会重新渲染根节点中的所有组件,还是仅重新渲染那些检测到其变化的特定组件及其子树?

4 个答案:

答案 0 :(得分:3)

  

React并不是完全重新渲染组件,而是找到差异并进行更改。 Angular 2会做这样的事吗?

从概念上讲,它不会重新渲染整个组件。

Angular为每个组件/指令构建一个更改检测器对象。在这些变化检测器对象内部跟踪模板绑定(包括输入属性绑定)。当更改检测运行时,默认情况下,每个绑定都是脏的,检查更改。如果找到更改,则更改的值将传播到子组件(如果输入属性已更改)或传播到DOM。就是这样。整个模板/视图不会重新渲染。仅在DOM中更新更改的值。当Angular更改检测完成后,浏览器会注意到DOM更改并更新我们在屏幕上看到的内容。

  

每当检测到状态发生变化时,Angular 2会重新渲染根节点中的所有组件,还是只重新渲染那些检测到其变化的特定组件及其子树?

Angular不会检测某些模型/数据对象的更改。相反,它只检测模板绑定的更改。

默认情况下,每次更改检测运行时,它都会从根组件开始,并使用这些更改检测器对象按深度优先顺序检查所有组件的更改。如上所述,仅更新具有更改的模板绑定。所以,我不会说Angular会重新渲染一个组件......它只会修改模板绑定发生变化的DOM部分。

您可以将组件配置为使用OnPush更改检测策略来限制检查该组件及其后代的更改时间。您还可以完全detach()来自更改检测器树的组件,这意味着在重新连接()之前,组件及其后代不会被检测到。

答案 1 :(得分:2)

Angular没有像React那样使用虚拟DOM。在Angular的背景下不需要这样做。

如果您有<input>并且需要在运行时将其值设置为其他内容,则不需要更改其周围的所有DOM。你只需在该元素上调用setValue()就可以了。

这同样适用于任何其他DOM元素。例如,如果你有这个:

<div>{{someVar}}</div>

并且Angular检测到someVar已更改,它将仅更改该特定<div>的内容。

答案 2 :(得分:1)

Angular仅呈现检测到更改的位置。

AFAIK在*ngFor中有一些改进空间,当有些项目在中间或开头添加/删除时,有时会重新渲染太多项目,但这是一个已知问题,最终会得到修复。 / p>

从我的评论

  

事实上,Angular不需要重新渲染优化,因为它只在绑定值发生变化时才会执行任何操作,然后它只会更改绑定到更改值的DOM。 Angular没有需要镜像到实际DOM的虚拟DOM。

答案 3 :(得分:0)

Angular2正在使用zone.js进行 onChange 渲染。通常当检测到更改时,它会触发 changeDetection 该组件和所有子项,但您也可以控制更改它,强制渲染某些东西或不渲染时不喜欢angular2行为。

以下是关于Angular2 change detection如何运作的非常好的讨论:https://www.youtube.com/watch?v=CUxD91DWkGM

LE:只是为了澄清,它不会重新渲染组件和所有子组件,它将检测并触发所有这些组件的更改,但只会呈现所需的内容。