Лучший и динамический способ отрисовки длинных списков элементов в DOM
Когда мы работаем с большим списком данных, обработка этих данных в DOM всегда является проблемой с точки зрения эффективности и производительности.
Когда мы пытаемся загрузить эти данные в DOM, он создает узлы в DOM с размером данных и начинает раздувать нашу DOM и страницу с длинным списком данных.
Пример-
if data is an array [] with length 100
<div class="example-viewport"> <div *ngFor="let item of data" class="list"> <h2>{{item.name}}</h2> </div> </div>
As data [] has length 100, it will create 100 nodes in DOM.
Проблема -
В приведенном выше примере мы взяли данные длиной 100, предположим, что у них больше данных, чем они создадут больше узлов в DOM, и с увеличением размера данных это замедлит наше приложение, оно начнет раздувать нашу DOM и страницу.
Решение
Angular (7+) дает нам доступ к новому поведению виртуальной прокрутки в Material Component Development Kit (CDK). Он предоставляет инструменты для циклического перебора данных, который отображает элементы только тогда, когда они видны в области просмотра, и обеспечивает лучший и динамичный способ эффективного отображения длинных списков элементов в DOM.
Component Development Kit (CDK) -
- это набор инструментов, реализующих общее поведение. Это своего рода абстракция библиотеки материалов Angular, без стилизации, специфичной для материального дизайна.
Давайте реализуем бесконечную виртуальную прокрутку
Предварительные требования - Angular (версия 7 или 7+), Node версии 11.0 или выше.
Шаг 1. Добавьте пакет @ angular / cdk
npm install @angular/cdk
Шаг 2: импортируйте ScrollingModule в свой модуль
import { ScrollingModule} from '@angular/cdk/scrolling';
imports: [
...,
ScrollingModule
]
Шаг 3. Внутри вашего компонента
Wrap your looping element inside <cdk-virtual-scroll-viewport> </cdk-virtual-scroll-viewport> use *cdkVirtualFor instead of *NgforitemSize
directive tells how tall(height of height) each item will be(in pixels). So,itemSize="100"
means that item in the list will require 100px of height. <cdk-virtual-scroll-viewport itemSize="100"> <li *cdkVirtualFor="let item ofdata
"> <!-- Print item here --> </li> </cdk-virtual-scroll-viewport>
Поздравляем, вы закончили с базовой бесконечной виртуальной прокруткой. Это улучшит производительность страницы и загрузку данных.
Дополнительная информация с дополнительными функциями cdk-virtual-scroll
Пользовательские события - прослушивание события при прокрутке определенного элемента
<cdk-virtual-scroll-viewport itemSize="100" (scrolledIndexChange)="scrollhandler($event)">
</cdk-virtual-scroll-viewport>
Доступ к CdkVirtualScrollViewport и его методу
import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
@ViewChild(CdkVirtualScrollViewport) viewport: CdkVirtualScrollViewport;
Access methods likethis.viewport.scrollToIndex(23)
* cdkVirtualFor предоставляет несколько логических переменных в вашем шаблоне
<cdk-virtual-scroll-viewport itemSize="100">
<li *cdkVirtualFor="let item of data;
let index = index;
let count = count;
let first = first;
let last = last;
let even = even;
let odd = odd;">
<!-- Print item here -->
</li>
</cdk-virtual-scroll-viewport>
Удачного обучения… 👏👏👏