我是否应该始终使用ChangeDetectionStrategy.OnPush

Dol*_*lan 5 angular2-changedetection angular angular-changedetection

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

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

如果真是太神奇了,那我们应该一直使用它吗?

Rit*_*esh 10

为什么它不是默认生成的 ng g 组件?

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

您可以在此处阅读有关 ChangeDetection 的更多信息:https ://blog.angularindepth.com/everything-you-need-to-know-about-change-detection-in-angular-8006c51d206f

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

一个很好的例子OnPush()是加载器组件。


Fer*_*rie 6

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

在需要时启动检测的方法有很多种,也许最常用的是changeDetection()ChangeDetectorRef.

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

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

如果你想让你的新生成的组件自动OnPush添加策略,你只需要在你angular.jsonschematics节点中添加选项,例如:

...

    "schematics": {
        "@schematics/angular:component": {
            "changeDetection": "OnPush",
            "prefix": "app",
            "styleext": "scss"
        },
        "@schematics/angular:directive": {
            "prefix": "app"
        }
    }
...
Run Code Online (Sandbox Code Playgroud)