【问题标题】:OnPush Change Detection for special cases特殊情况的 OnPush 变更检测
【发布时间】:2017-06-15 09:22:26
【问题描述】:

我使用 ngrx 开发了一个 Angular 2 应用程序,并且我对 OnPush 更改检测感兴趣以获得更好的性能。我读过几篇关于它的文章:“如果一个组件只依赖于它的输入属性,并且它们是不可变的,那么当且仅当它的一个输入属性发生变化时,这个组件才能改变。”。因此,我对 OnPush 有两个(简单)问题:

1) 如果我的组件混合了@Input() 属性而不是输入属性,OnPush 没用吗?

2) 对于只有属性(没有@Input)的组件,同样的问题。

提前致谢:)

【问题讨论】:

    标签: angular typescript web-component angular2-changedetection


    【解决方案1】:

    OnPush 不影响组件内部状态。

    如果您查看 Victor Savkin 的 excellent post,他会特别提到

    值得注意的是,一个组件仍然可以有私有的可变对象 状态,只要它仅由于输入被更新或 从组件的模板中触发的事件。唯一的事情 OnPush 策略不允许取决于共享的可变状态。 在此处阅读更多信息。

    值得花时间在这篇文章以及他提到的同伴帖子上。

    【讨论】:

    • 您也可以只调用ChangeDetectorRef.detectChanges()ChangeDetectorRef.markForCheck() 在您的代码修改状态后调用更改检测。
    • @GünterZöchbauer 我什么都不懂。如果我的组件没有 Input 属性,OnPush 对它没用吗?
    • 我不认为存在OnPush 无用的真实场景。也许如果您的组件中没有任何绑定。如果您有一些偶尔更改的状态和绑定到此状态的绑定,那么OnPush 允许您将更改检测率限制在必要的最小值。
    • @GünterZöchbauer 好的,伙计。我的最后一个问题,我猜我会完全理解。假设我们有一个组件树(A-B-C-D-E-F-G)。 F 触发一个事件。 A 是 OnPush 检测策略。由于角度变化检测从 RootComponent (A) 开始,并且它具有一个属性(并且没有出现任何变化),所以变化检测如何到达 F 组件? A的子树一定不能检查吧?
    • 我认为F可以认为是在A的模板内。如果是冒泡的 DOM 事件,那么肯定是 As 模板中的事件,并且更改检测将在整个树上运行(如果 G 不是 OnPush)。如果它是绑定在E 中的@Output() 的事件,那么E 将被标记为进行更改检测。我不是 100% 确定,但我认为这也会导致更改检测运行 A 并运行整个树。
    猜你喜欢
    • 2017-09-28
    • 1970-01-01
    • 2017-06-23
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2020-10-04
    • 1970-01-01
    相关资源
    最近更新 更多