我应该总是使用ChangeDetectionStrategy.OnPush吗?



我应该在我的组件中始终使用ChangeDetectionStrategy.OnPush吗?

我总是听说OnPush绝对令人惊叹,解决了很多问题,加快了 Angular 应用程序的速度,甚至摆脱了NgZone。但如果是,为什么默认情况下不生成ng g component

如果它如此神奇,那么我们应该一直使用它吗?

如果您特别处理非常大的项目,建议使用OnPush策略来减少更改检测过程,因为这是一项非常昂贵的操作。

有很多方法可以在需要时启动检测,也许最常用的是从ChangeDetectorRef手动changeDetection()触发。

如果你有一个继承的项目,并且想要使用OnPush策略,建议从叶组件开始应用它,检查一切是否仍在工作,然后跟随祖先并一次上升一个级别到根。最终,整体性能将受益。

这里有一篇关于 Angular 中变化检测的非常好的文章。

如果您希望新生成的组件自动添加OnPush策略,您只需在angular.jsonschematics节点上添加该选项,例如:

...
"schematics": {
"@schematics/angular:component": {
"changeDetection": "OnPush",
"prefix": "app",
"styleext": "scss"
},
"@schematics/angular:directive": {
"prefix": "app"
}
}
...

为什么默认情况下不使用ng g组件生成?

这是开发人员需要做出的设计决策。ChangeDetectionStartegy.OnPush适用于不可变对象。如果不使用不可变对象,将很难找到组件出了什么问题。由于角度团队不会强迫您使用不可变的对象,为什么他们会使用此策略生成组件。

您可以在此处阅读有关更改检测的更多信息:您需要了解的有关 Angular 中更改检测的所有信息

OnPush 旨在与具有@Input()装饰器的组件配合使用。简单来说,从其父组件获取输入的组件。由于更改检测是一项成本高昂的操作,因此您可以将此类组件配置为仅在其输入属性更改时运行更改检测。

要使用的OnPush()的一个很好的例子是加载程序组件。

最新更新