我几个月来一直在使用React,React并不是完全重新渲染组件而是找到差异并进行更改。 Angular 2会做这样的事吗?
每当检测到状态发生变化时,Angular 2会重新渲染根节点中的所有组件,还是仅重新渲染那些检测到其变化的特定组件及其子树?
答案 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:只是为了澄清,它不会重新渲染组件和所有子组件,它将检测并触发所有这些组件的更改,但只会呈现所需的内容。