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

时间:2018-10-25 00:05:23

标签: angular angular2-changedetection angular-changedetection

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

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

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

2 个答案:

答案 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"
        }
    }
...