17

我应该总是ChangeDetectionStrategy.OnPush在我的组件中使用吗?

我总是听到它是多么OnPush令人惊叹,解决了这么多问题,加速了 Angular 应用程序,甚至摆脱了NgZone. 但如果是,为什么默认情况下不生成它ng g component

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

4

2 回答 2

11

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

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

您可以在此处阅读有关 ChangeDetection 的更多信息:关于 Angular 中的变更检测您需要了解的一切

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

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

于 2018-10-25T06:47:25.707 回答
9

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

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

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

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

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

...

    "schematics": {
        "@schematics/angular:component": {
            "changeDetection": "OnPush",
            "prefix": "app",
            "styleext": "scss"
        },
        "@schematics/angular:directive": {
            "prefix": "app"
        }
    }
...
于 2019-12-03T12:44:58.527 回答