默认 vs OnPush

考虑以下组件,其中一个输入 myInput 和一个名为 someInternalValue 的内部值。它们都用在组件的模板中。

import {Component, Input} from '@angular/core';

@Component({
  template:`
  <div>
    <p>{{myInput}}</p>
    <p>{{someInternalValue}}</p>
  </div>
  `
})
class MyComponent {
  @Input() myInput: any;

  someInternalValue: any;

  // ...
}

默认情况下,组件装饰器中的 changeDetection:属性将设置为 ChangeDetectionStrategy.Default; 隐含在示例中。在这种情况下,对模板中任何值的任何更改都将触发 MyComponent 的重新渲染。换句话说,如果我改变 myInputsomeInternalValue 角度 2 将发挥能量并重新渲染组件。

但是,假设我们只想在输入改变时重新渲染。考虑以下组件,将 changeDetection:设置为 ChangeDetectionStrategy.OnPush

import {Component, ChangeDetectionStrategy, Input} from '@angular/core';

@Component({
  changeDetection: ChangeDetectionStrategy.OnPush
  template:`
  <div>
    <p>{{myInput}}</p>
    <p>{{someInternalValue}}</p>
  </div>
  `
})
class MyComponent {
  @Input() myInput: any;

  someInternalValue: any;

  // ...
}

通过将 changeDetection:设置为 ChangeDetectionStrategy.OnPushMyComponent 将仅在其输入发生变化时重新渲染。在这种情况下,myInput 将需要从其父级接收新值以触发重新渲染。