代码之家  ›  专栏  ›  技术社区  ›  James Delaney

如何提高ngfor循环的性能?

  •  0
  • James Delaney  · 技术社区  · 8 年前

    当ngfor呈现7600个字符串项时,性能非常慢,浏览器会在几秒钟内冻结。

    是否有可能提高NGFOR的性能?

    NGFOR代码:

      <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>
    
    1 回复  |  直到 8 年前
        1
  •  6
  •   Philipp Meissner    8 年前

    NgForOf 在Angular 6中,可以选择覆盖 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 )

    推荐文章