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