javascript - 如何提高ngFor循环的性能?

标签 javascript angular typescript

当 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>

最佳答案

Angular 6 中的

NgForOf 提供了覆盖 track by 函数 ( source ) 的选项。 它允许您选择 Angular 应检查更改的属性/条件。

为此,只需向组件添加一个方法,如下所示:

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 )。

关于javascript - 如何提高ngFor循环的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51324460/

相关文章:

javascript - 字符串中的 JSON 对象未返回字符串

javascript - 弹出窗口时焦点关闭按钮

php - 名称为“提交”的按钮停止触发表单的提交事件?

angular - 如何在 typescript 类中将 mat-lines-button 更改为 mat-button ?

angular - 当同一组件加载不同数据时不调用 ngOnInit

Angular 4 - 如何让我的复选框更改变量的值?

javascript - 对原始 html 输出的文本进行一致的解析

javascript - 特拉维斯/杰斯特 : TypeError: Cannot assign to read only property 'Symbol(Symbol.toStringTag)' of object '#<process>'

typescript - 仅在 node_modules 中跳过库检查

angular - Nativescript 后退按钮没有重定向到正确的页面