Performance: Virtual scrolling for large lists
Virtual scrolling improves page load speed and rendering performance by only rendering visible list items instead of the entire large list.
import { Component } from '@angular/core'; import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling'; @Component({ selector: 'app-virtual-list', template: `<cdk-virtual-scroll-viewport itemSize="40" style="height:400px;"> <div *cdkVirtualFor="let item of items">{{item}}</div> </cdk-virtual-scroll-viewport>` }) export class VirtualListComponent { items = Array.from({length: 10000}, (_, i) => `Item ${i + 1}`); }
import { Component } from '@angular/core'; @Component({ selector: 'app-large-list', template: `<div style='height:400px; overflow:auto;'> <div *ngFor='let item of items'>{{item}}</div> </div>` }) export class LargeListComponent { items = Array.from({length: 10000}, (_, i) => `Item ${i + 1}`); }
| Pattern | DOM Operations | Reflows | Paint Cost | Verdict |
|---|---|---|---|---|
| Rendering full list | 10,000 nodes created | 10,000 reflows | High paint cost | [X] Bad |
| Virtual scrolling | 20-30 nodes created | 20 reflows | Low paint cost | [OK] Good |
cdk-virtual-scroll-viewport in Angular for large lists?cdk-virtual-scroll-viewport role*cdkVirtualFor instead of *ngFor to render visible items only.itemSize attribute is required on cdk-virtual-scroll-viewport to set fixed item height for scrolling calculations.<cdk-virtual-scroll-viewport itemSize="40" style="height: 120px;">
<div *cdkVirtualFor="let item of items">{{item}}</div>
</cdk-virtual-scroll-viewport>items = ['A', 'B', 'C', 'D', 'E'], how many items will be visible at once?<cdk-virtual-scroll-viewport itemSize="50">
<div *cdkVirtualFor="let item in items">{{item}}</div>
</cdk-virtual-scroll-viewport>itemSize to calculate visible items and smooth scrolling.cdk-virtual-scroll-viewport with a fixed height and *cdkVirtualFor to render only visible items efficiently.itemSize or using *ngFor causes performance issues or errors.Pass the test and this pattern moves unknown