在Angular中,* ngFor是否需要trackBy函数?我看到了几篇文章here,here,here和here,它们说使用trackBy可以提高性能并具有更好的内存管理。但是我想知道trackBy是否会带来这样的改进,那么为什么它不是默认行为呢?这是默认行为,我正在查看的所有内容都已过时了吗?
如果不是默认行为,则我的项目在90个组件中大约有90个* ngFor,我想知道是否有一种方法可以使用trackBy,而我并未将以下函数包含90次。我也想避免添加服务并将其导入90次。
HTML
<mat-option *ngFor="let l of list; trackBy: trackByFn" [value]="l.id">
{{l.name}}
</mat-option>
TS
trackByFn(index, item) {
return index
}
最佳答案
请注意,您的所有示例都没有使用索引(除了一篇不可靠的中篇文章),它们都使用了angular可能无法知道的对象的唯一标识符,除非您告诉它。
仅返回索引就有一个用例,但这是一种非常不常见的用例。基本上,这是告诉angular永远不要重新呈现此列表中的现有项目,因为给定项目的索引永远不会改变。对于开发人员来说,这通常是非常意外的行为,因为子组件的初始化生命周期 Hook 将不会重新执行。尽管在不包含子组件的ngFor中,这通常是安全的,但是这类列表通常反而更有效,除非列表很长或经常更改,否则您不会看到太多好处。
trackBy的想法是允许您重新初始化列表中需要它的项目,而不重新初始化那些不需要的项目。它并不是像某些人对待它那样盲目提高性能的 Elixir ,它的目的和功能应该得到充分的理解。请记住,仅由于项目具有唯一ID并不意味着它适合在trackBy函数中使用。 trackBy的作用是告诉 Angular 何时需要重新渲染项目,即何时需要重新运行生命周期 Hook 。如果ID保持不变,但内容可以更改,具体取决于您构建特定组件的方式,则无论如何都可能需要重新初始化该组件。