Angular虚拟列表实现大数据量分页显示

在Angular应用程序中,当需要展示大量数据时,为了不造成性能问题,通常会采用分页技术。分页技术可以减少一次性加载到视图中的数据量,从而提高UI的响应速度和性能。但是,如果数据量非常大,即使是分页,也可能会对性能造成影响。这时,可以使用虚拟列表技术来进一步优化性能。

虚拟列表技术的核心思想是,只渲染视图中可见的数据行,而不是一次性渲染所有数据。这样,DOM中的数据行数量就会保持在一个较低的水平,从而减轻浏览器的负担,提高性能。

下面是一个使用Angular实现虚拟列表的示例代码。

// 安装虚拟列表npm包 npm install angular-virtual-list // 在app.module.ts中导入VirtualListModule import { VirtualListModule } from 'angular-virtual-list';

首先,需要定义一个用户模型类。

export class UserModel { id: number; name?: string; contact?: string; address?: string; }

然后,创建一个虚拟列表组件。

@Component({ selector: 'app-virtuallist', templateUrl: './virtuallist.component.html', styleUrls: ['./virtuallist.component.scss'] }) export class VirtuallistComponent implements OnInit { public items: Array = []; public scrollList: Array = []; protected items$ = new BehaviorSubject(null); protected buffer: UserModel[] = []; protected loading: boolean; protected startingItem: number; protected enditem: number; constructor() { this.setItem(); } ngOnInit() { } protected fetchMore(event: ChangeEvent) { this.startingItem = event.start + 1; this.enditem = event.end; if (event.end == this.buffer.length) return; } public setItem() { for (var i = 0; i < 1000000; i++) { var item = new UserModel(); item.id = i + 1; item.name = "Name " + (i + 1).toString(); item.contact = "+1 650-253-0000"; item.address = (1600 + i + 1).toString() + " Amphitheatre Pkwy, Mountain View, CA 94043, United States"; this.items.push(item); } this.items$.next(this.items); console.log(this.scrollList); } }

接下来,需要定义HTML视图。

<h2>Total Record Count: {{items.length}}</h2> <h2 *ngIf="startingItem">{{startingItem}} to {{enditem}} of {{items.length}} are loaded</h2> <div class="table-like"> <div class="table-head"> <span style="margin-left: 2px; text-align: center;">Id</span> <span style="margin-left: 50px; text-align: center;">Name</span> <span style="margin-left: 60px; text-align: center;">Contact Number</span> <span style="margin-left: 200px;">Address</span> </div> <virtual-list [source$]="items$" (update)="scrollList = $event" (end)="fetchMore($event)" height="400"> <div *ngFor="let item of scrollList" style="display: table-row;"> <span style="display: table-cell; padding: 3px 0 0 2px; text-align: center;">{{item.id}}</span> <span style="display: table-cell; padding-left: 36px;text-align: center;">{{item?.name}}</span> <span style="display: table-cell; padding-left: 36px;">{{item?.contact}}</span> <span style="display: table-cell; padding-left: 36px;">{{item?.address}}</span> </div> </virtual-list> </div>

最后,需要定义一些CSS样式。

.table-like { border: 1px solid #9173ff; width: 900px; } .table-head { color: #fff; background-color: #6940ff; border-bottom: 1px solid #9173ff; }

通过这种方式,当用户滚动列表时,只会显示固定数量的行,以保持DOM的一致性。例如,如果服务端发送了一个包含100万条数据的数组,而虚拟列表的高度是500px,那么它将一次性显示大约10-14行数据,并且在滚动时,这些行将被下一组或上一组元素替换。这样,DOM中的数据行数量将始终保持在10到14行,从而保持性能。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485