我正在使用 Angular/Material 自动完成。将数据加载到自动完成时会遇到严重的性能问题,例如渲染大约需要 30 秒,并且需要 10 多秒才能稳定,数据是从服务器加载的,从服务器接收的数据非常快。为了克服这个问题,我使用了 cdkVirtualScroll,在向下滚动到结束并再次单击文本框后,它在滚动其加载值后加载空弹出窗口。
html
<mat-form-field>
<input type="text" placeholder="Pick one" aria-label="Number" matInput [matAutocomplete]="auto">
<mat-autocomplete #auto="matAutocomplete" (opened)="panelOpened()">
<cdk-virtual-scroll-viewport itemSize="48" style="height: 240px" minBufferPx="96" maxBufferPx="144">
<mat-option *cdkVirtualFor="let option of options" [value]="option">
{{option}}
</mat-option>
</cdk-virtual-scroll-viewport>
</mat-autocomplete>
</mat-form-field>
TS
export class AppComponent {
options: string[] = [];
@ViewChild(CdkVirtualScrollViewport, {static: true}) viewport: CdkVirtualScrollViewport;
constructor() {
for (let i = 0; i < 10000; i++) {
this.options.push("#"+i);
}
}
panelOpened() {
if (this.viewport) {
this.viewport.checkViewportSize();
}
}
}
检查前:https ://stackblitz.com/edit/angular-7vcohv?file=src%2Fapp%2Fapp.component.html