javascript - Hur förbättrar man prestandan i en ngFor-loop?
När ngFor ska rendera 7600 objekt som är strängar, då är prestandan mycket långsam, webbläsaren fryser i ett par sekunder.
Är det på något sätt möjligt att förbättra prestandan för ngFor?
ngFor-kod:
<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>
Svar #1
NgForOf i Angular 6 levereras med alternativet att åsidosätta track by-funktionen (källa). Det låter dig välja vilken egenskap/vilket villkor Angular ska kontrollera ändringar mot.
För det, lägg helt enkelt till en metod i din komponent på följande sätt:
trackByFn(index, item) {
return item.someUniqueIdentifier;
// or if you have no unique identifier:
// return index;
}
Medan du i din komponents HTML ändrar loopen till
<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 kommer automatiskt att skicka den aktuella indexet, samt det aktuella objektet till funktionen.
Här är ett bra inlägg med ett mer konkret exempel och ytterligare information (Tack @Pedro Arantes).
Svar #2
Lösningen med trackBy och funktionen är korrekt.
Min lösning är följande:
<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">
använder
let i = index; trackBy: i
för att undvika att ha en funktion
