Angular Material 的 <cdk-virtual-scroll-viewport>
是一个高性能滚动容器,用于处理大量数据的虚拟渲染。它只渲染当前视口中可见的元素,而不是整个列表,从而提高性能。
当使用虚拟滚动结合分页数据加载时,可能会遇到重复请求第2页数据的情况,即使实际上并不需要第2页数据。
import { Subject } from 'rxjs';
import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
private loadMoreSubject = new Subject<void>();
constructor() {
this.loadMoreSubject.pipe(
debounceTime(300),
distinctUntilChanged()
).subscribe(() => this.loadMoreData());
}
onScroll() {
this.loadMoreSubject.next();
}
loading = false;
allDataLoaded = false;
loadMoreData() {
if (this.loading || this.allDataLoaded) return;
this.loading = true;
this.dataService.getData(this.currentPage).subscribe(newData => {
if (newData.length === 0) {
this.allDataLoaded = true;
} else {
this.data = [...this.data, ...newData];
this.currentPage++;
}
this.loading = false;
});
}
<cdk-virtual-scroll-viewport [itemSize]="50" (scrolledIndexChange)="onScroll()">
<div *cdkVirtualFor="let item of data">
{{item}}
</div>
</cdk-virtual-scroll-viewport>
trackByFn(index: number, item: any): number {
return item.id; // 使用唯一标识符
}
<div *cdkVirtualFor="let item of data; trackBy: trackByFn">
虚拟滚动特别适用于:
itemSize
以确保正确计算滚动位置trackBy
提高渲染性能通过以上方法,可以有效解决虚拟滚动中重复请求的问题,同时保持应用的性能和用户体验。
没有搜到相关的文章