Angular 2 是否有重新渲染优化
Does Angular 2 have re-rendering optimization?
我已经使用 React 几个月了,React 不会简单地完全重新渲染组件,而是找到差异并进行这些更改。Angular 2 会做这样的事情吗?
此外,每当检测到状态更改时,Angular 2 是重新渲染根节点中的所有组件,还是仅重新渲染检测到更改的特定组件及其子树?
React 不会简单地完全重新渲染组件,而是找到差异并进行这些更改。Angular 2 会做这样的事情吗?
从概念上讲是的,它不会重新渲染整个组件。
Angular 为每个组件/指令构建一个变化检测器对象。 模板绑定(包括输入属性绑定)在这些更改检测器对象中跟踪。 运行更改检测时,默认情况下,每个绑定都会对更改进行脏检查。 如果找到更改,则更改的值将传播到子组件(如果输入属性已更改)或 DOM 。 就是这样。 不会重新呈现整个模板/视图。 DOM 中仅更新更改的值。 当角度变化检测完成后,浏览器会注意到 DOM 的变化并更新我们在屏幕上看到的内容。
每当检测到状态更改时,Angular 2 是重新渲染根节点中的所有组件,还是仅重新渲染检测到更改的特定组件及其子树?
Angular 不会检测到对某些模型/数据对象的更改。 相反,它仅检测对模板绑定的更改。
默认情况下,每次运行更改检测时,它都会从根组件开始,并使用这些更改检测器对象按深度优先顺序检查所有组件的更改。 如上所述,仅更新具有更改的模板绑定。 所以,我不会说 Angular 曾经重新渲染过一个组件......它只修改模板绑定更改的 DOM 部分。
您可以将组件配置为使用 OnPush
更改检测策略来限制检查该组件及其后代何时进行更改。 您也可以从更改检测器树中完全分离()组件,这意味着在重新附加()之前不会检测到该组件及其后代。
不像 React 那样使用虚拟 DOM。 在 Angular 的上下文中不需要这样做。
如果您有<input>
并且需要在运行时将其值设置为其他值,则无需更改它周围的所有 DOM。您只需在该元素上调用 setValue(),仅此而已。
这同样适用于任何其他 DOM 元素。例如,如果您有以下内容:
<div>{{someVar}}</div>
并且 Angular 检测到某些 Var 被更改,它将仅更改该特定<div>
的内容。
Angular 仅在检测到更改的地方渲染。
AFAIK 在*ngFor
中有一些改进的空间,当在中间或开头添加/删除一些项目时,它有时会重新渲染太多项目,但这是一个已知问题,最终会修复。
来自我下面的评论
事实上,Angular 不需要重新渲染优化,因为它只在绑定值更改时执行任何操作,然后它只更改绑定到更改值的 DOM。Angular 没有一个虚拟 DOM,它需要镜像到实际的 DOM。
Angular2 正在使用 zone.js 进行 onChange 渲染。通常,当检测到更改时,它将触发changeDetection该组件和所有子组件,但您也可以控制更改它,强制渲染某些内容或在不喜欢angular2行为时不渲染。
这里有一个关于Angular2变化检测如何工作的非常好的讨论 https://www.youtube.com/watch?v=CUxD91DWkGM:
LE:澄清一下,它不会重新渲染组件和所有子组件,它会检测并触发所有这些更改,但只会渲染必要的内容。
- 如何强制对模态进行新渲染
- Angular 2 是否有重新渲染优化
- 如何在渲染新视图之前关闭所有事件
- 扩展成员应用程序,包括新的路线,现在没有任何渲染
- React选择性地不将新道具传递给渲染对象
- ajax重新渲染时获得新值
- 优化静态场景的Three.JS渲染时间
- React 组件渲染在推送新 URL 时被多次调用
- 主干(也是木偶)尝试在集合开始时显示新记录,而不重新渲染整个集合
- 如何使用布局管理器重新排序/排序嵌套视图而不重新渲染
- 优化快速 + 滑动 HTML 渲染时间
- 使用新的javascript性能.在iframe上优化API
- 在backbone.js中,如何使用新的模型数据更新视图,同时在没有完整渲染的情况下保持排序顺序
- d3.js树映射新数据;t渲染
- 让流星重新渲染“;新文档”;
- 不要在新页面加载或刷新时渲染React组件
- 加载/渲染一个新的基于平铺的地图到HTML5画布,替换一个旧的地图
- 谷歌地图v3方向渲染器重新绘制响应
- 关注标签触发模糊事件后新渲染的文本输入
- 画布渲染优化