我应该始终在组件中使用ChangeDetectionStrategy.OnPush
吗?
我总是听到OnPush
绝对令人惊奇,并且解决了很多问题,加快了Angular应用的速度,甚至摆脱了NgZone
。但是如果是这样,为什么默认不使用ng g component
生成它?
如果它是如此神奇,那么我们应该一直使用它吗?
答案 0 :(得分:2)
为什么默认不使用ng g组件生成它?
这是开发人员需要做出的设计决策。 ChangeDetectionStartegy.OnPush仅在使用不可变对象时才有效。如果不这样做,您将很难找到组件的问题。由于有角度的团队不会强迫您使用不可变的对象,因此为什么他们会使用这种策略生成组件。
您可以在此处了解有关ChangeDetection的更多信息:https://blog.angularindepth.com/everything-you-need-to-know-about-change-detection-in-angular-8006c51d206f
OnPush旨在与具有@Input()
装饰器的组件一起使用。简而言之,组件从其父组件获取输入。由于更改检测是一项昂贵的操作,因此可以将此类组件配置为仅在其输入属性更改时才运行更改检测。
使用OnPush()
的一个很好的例子是装载程序组件。
答案 1 :(得分:1)
如果您特别是在大型项目中工作,建议使用OnPush
策略来减少变更检测过程,因为这是一项非常昂贵的操作。
有许多方法可以在需要时启动检测,也许最常用的是从changeDetection()
手动触发ChangeDetectorRef
。
如果您有一个继承的项目,并且想使用OnPush
策略,建议您从叶子组件开始应用它,检查一切是否仍然有效,然后跟着祖先向上走到根的水平。最终,整体性能将受益。
Here there is a very good article about change detection in Angular。
如果希望组件自动添加OnPush
策略,则只需在angular.json
节点的schematics
中添加选项,例如:
...
"schematics": {
"@schematics/angular:component": {
"changeDetection": "OnPush",
"prefix": "app",
"styleext": "scss"
},
"@schematics/angular:directive": {
"prefix": "app"
}
}
...