当ngFor应该渲染7600个字符串项目时,性能会非常缓慢,浏览器会冻结几秒钟。
是否可以提高ngFor的性能?
ng对于代码:
<ul *ngIf="isOpen"
class="nano-drop-down-list"
dropdownMenu>
<li class="nano-f-r nano-f-30">
<input [(ngModel)]="searchString"
class="nano-f nano-p-0_10 nano-bc-ws hover-effect"
placeholder="Search..." type="text"/>
</li>
<!-- ngFor which should be improved -->
<li *ngFor="let option of arrayOfOptions | nanoSearchByKey:searchString:displayProperty;"
[ngClass]="{'active':isOptionSelected(option[valueProperty])}"
class="nano-f-r nano-f-30 nano-bc-ws hover-effect">
<button (click)="handleClickOnOption(option[valueProperty]);"
type="button"
class="nano-f-c nano-f nano-p-0_10 nano-overflow-h">
<div class="nano-f-r nano-f">
<span class="nano-m-aaa0 nano-overflow-e">
{{ option[displayProperty] }}
</span>
<div *ngIf="isMultiple"
class="nano-f-r nano-f-30">
<i *ngIf="isOptionSelected(option[valueProperty])"
class="fa fa-check nano-m-a"
aria-hidden="true"></i>
</div>
</div>
</button>
</li>
</ul>
答案 0 :(得分:6)
NgForOf
带有覆盖track by
函数(source)的选项。
它使您可以选择应检查哪些属性/条件角度。
为此,只需向您的组件添加一个方法,如下所示:
trackByFn(index, item) {
return item.someUniqueIdentifier;
// or if you have no unique identifier:
// return index;
}
在组件HTML中,将循环更改为
<li *ngFor="let option of arrayOfOptions | nanoSearchByKey:searchString:displayProperty; trackBy: trackByFn"
[ngClass]="{'active':isOptionSelected(option[valueProperty])}"
class="nano-f-r nano-f-30 nano-bc-ws hover-effect">
Angular将自动将当前索引以及当前项传递给函数。
Here's是一篇不错的文章,其中包含更具体的示例和更多信息(感谢@Pedro Arantes)。
答案 1 :(得分:0)
使用trackBy和功能的解决方案正确。
我的解决方法是:
<li *ngFor="let option of arrayOfOptions | nanoSearchByKey:searchString:displayProperty;let i = index;trackBy: i" [ngClass]="{'active':isOptionSelected(option[valueProperty])}"
class="nano-f-r nano-f-30 nano-bc-ws hover-effect">
使用
let i = index; trackBy: i
为了避免具有功能