由于这个话题仍然很活跃,而且很难找到一个明确的答案,所以除了@Max的答案之外,我还要添加几个例子:
app.component.ts
array = [
{ "id": 1, "name": "bill" },
{ "id": 2, "name": "bob" },
{ "id": 3, "name": "billy" }
]
foo() {
this.array = [
{ "id": 1, "name": "foo" },
{ "id": 2, "name": "bob" },
{ "id": 3, "name": "billy" }
]
}
identify(index, item) {
return item.id;
}
让我们array
使用 3 个 div显示*ngFor
。
app.component.html
*ngFor
没有 trackBy的例子:
<div *ngFor="let e of array;">
{{e.id}} - {{e.name}}
</div>
<button (click)="foo()">foo</button>
如果我们点击foo
按钮会发生什么?
→ 3 个 div 将被刷新。自己尝试一下,打开你的控制台进行验证。
*ngFor
使用 trackBy的示例:
<div *ngFor="let e of array; trackBy: identify">
{{e.id}} - {{e.name}}
</div>
<button (click)="foo()">foo</button>
如果我们点击foo
按钮会发生什么?
→ 只有第一个 div 会被刷新。自己尝试一下,打开你的控制台进行验证。
如果我们更新第一个对象而不是整个对象呢?
foo() {
this.array[0].name = "foo";
}
→ 这里不需要使用trackBy
。
当使用通常看起来像我用array
. 所以它看起来像:
array = [];
subscription: Subscription;
ngOnInit(): void {
this.subscription = this.fooService.getArray().subscribe(data => {
this.array = data;
});
}
identify(index, item) {
return item.id;
}
从文档中:
为了避免这种昂贵的操作,您可以自定义默认的跟踪算法。通过向 NgForOf 提供 trackBy 选项。trackBy 接受一个有两个参数的函数:index 和 item。如果给出了 trackBy,Angular 会根据函数的返回值跟踪变化。
在这里阅读更多:https ://angular.io/api/common/NgForOf
在这里找到我的原始答案:https ://stackoverflow.com/a/57890227/9753985