Strategy OnPush 是什么意思?
What does Strategy OnPush mean?
我是使用 TypeScript 的 Angular2 新手。我目前正在做一个项目,不幸的是,无法理解 OnPush 的作用:
changeDetection : ChangeDetectionStrategy.OnPush
我搜索了很多,但没有找到(没看懂)正确答案。
谁能给我解释一下?例子可能是值得赞赏的。
On push change detection 意味着组件上的变化检测 运行 仅当输入发生变化时,并且当输入发生变化时,它们的整个对象必须发生变化。这意味着如果只有引用发生变化,变化检测将不会是 运行.
例如,如果您在数组组件上输入:
@Input() testArray: Item[] = [];
如果您在父组件中使用 push
修改该数组,更改检测将不会在子组件上 运行。但是如果你这样做:
array = [...array, newItem];
<test-component [testArray]="array"></test-component>
更改检测将 运行。这用于提高您的应用程序性能,因为它大大减少了更改检测 运行 的次数。它通常与 不可变 数据结构配对,尤其是 Redux
具有 store
的模式,例如 @ngrx/store
.
我觉得举个例子更容易理解:
您有一个具有输入属性的组件:
type Person {
name: string;
surname: string;
}
@Component({
selector: 'my-component',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `<p> {{person.name}} {{person.surname}} </p>`
})
class myComponent {
...
@Input() person: Person;
...
}
如果你用类似
的东西修改人的初始值
person.name="changed";
Angular 不会检测到该更改,因为它认为对象本身是相同的。您更改了对象的属性,而不是对象本身。您需要更改整个对象(引用)以使 Angular 检测到此更改:
person={name:'changed',surname:'something else'};
所以这就像 angular 将输入元素视为不可变对象,并且它们内部的任何更改都将被忽略。
我是使用 TypeScript 的 Angular2 新手。我目前正在做一个项目,不幸的是,无法理解 OnPush 的作用:
changeDetection : ChangeDetectionStrategy.OnPush
我搜索了很多,但没有找到(没看懂)正确答案。
谁能给我解释一下?例子可能是值得赞赏的。
On push change detection 意味着组件上的变化检测 运行 仅当输入发生变化时,并且当输入发生变化时,它们的整个对象必须发生变化。这意味着如果只有引用发生变化,变化检测将不会是 运行.
例如,如果您在数组组件上输入:
@Input() testArray: Item[] = [];
如果您在父组件中使用 push
修改该数组,更改检测将不会在子组件上 运行。但是如果你这样做:
array = [...array, newItem];
<test-component [testArray]="array"></test-component>
更改检测将 运行。这用于提高您的应用程序性能,因为它大大减少了更改检测 运行 的次数。它通常与 不可变 数据结构配对,尤其是 Redux
具有 store
的模式,例如 @ngrx/store
.
我觉得举个例子更容易理解:
您有一个具有输入属性的组件:
type Person {
name: string;
surname: string;
}
@Component({
selector: 'my-component',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `<p> {{person.name}} {{person.surname}} </p>`
})
class myComponent {
...
@Input() person: Person;
...
}
如果你用类似
的东西修改人的初始值person.name="changed";
Angular 不会检测到该更改,因为它认为对象本身是相同的。您更改了对象的属性,而不是对象本身。您需要更改整个对象(引用)以使 Angular 检测到此更改:
person={name:'changed',surname:'something else'};
所以这就像 angular 将输入元素视为不可变对象,并且它们内部的任何更改都将被忽略。