我应该在我的组件中始终使用ChangeDetectionStrategy.OnPush
吗?
我总是听说OnPush
绝对令人惊叹,解决了很多问题,加快了 Angular 应用程序的速度,甚至摆脱了NgZone
。但如果是,为什么默认情况下不生成ng g component
?
如果它如此神奇,那么我们应该一直使用它吗?
如果您特别处理非常大的项目,建议使用OnPush
策略来减少更改检测过程,因为这是一项非常昂贵的操作。
有很多方法可以在需要时启动检测,也许最常用的是从ChangeDetectorRef
手动changeDetection()
触发。
如果你有一个继承的项目,并且想要使用OnPush
策略,建议从叶组件开始应用它,检查一切是否仍在工作,然后跟随祖先并一次上升一个级别到根。最终,整体性能将受益。
这里有一篇关于 Angular 中变化检测的非常好的文章。
如果您希望新生成的组件自动添加OnPush
策略,您只需在angular.json
的schematics
节点上添加该选项,例如:
...
"schematics": {
"@schematics/angular:component": {
"changeDetection": "OnPush",
"prefix": "app",
"styleext": "scss"
},
"@schematics/angular:directive": {
"prefix": "app"
}
}
...
为什么默认情况下不使用ng g组件生成?
这是开发人员需要做出的设计决策。ChangeDetectionStartegy.OnPush
适用于不可变对象。如果不使用不可变对象,将很难找到组件出了什么问题。由于角度团队不会强迫您使用不可变的对象,为什么他们会使用此策略生成组件。
您可以在此处阅读有关更改检测的更多信息:您需要了解的有关 Angular 中更改检测的所有信息
OnPush 旨在与具有@Input()
装饰器的组件配合使用。简单来说,从其父组件获取输入的组件。由于更改检测是一项成本高昂的操作,因此您可以将此类组件配置为仅在其输入属性更改时运行更改检测。
要使用的OnPush()
的一个很好的例子是加载程序组件。