Skip to content

CdsVirtualScroll

New in v4.0

Виртуальный скролл держит длинные списки быстрыми: в DOM попадают только видимые строки, а не весь массив. Передайте записи в items, разметку строки — в слот, и список из десятков тысяч позиций прокручивается так же плавно, как из десяти.

Storybook GitLab
Покрытие тестами: 94% — хорошее покрытие
API в спеках
16 / 16 пропсы, события, слоты и exposed, у которых есть тест
Тест-кейсы
23 юнит · 3 браузерных
Известные баги
1 зафиксированы тестом it.fails
Покрытие кода
93.5% строк · 76.9% ветвей замер v4.0.0-alpha.13
A11y (axe)
6 рекомендаций в 7 историях замер v4.0.0-alpha.11

Выпадающие списки CdsSelect и CdsAutocomplete, как и дерево CdsTree, уже виртуализируют свои элементы — оборачивать их не нужно. Короткий список — до пары сотен строк — рендерите обычным CdsList: виртуализация выигрыша не даст.

Вариации ​

Фиксированная высота ​

Проп height задаёт высоту области просмотра — внутри неё появляется прокрутка. Если все строки одной высоты, укажите item-height: компонент не будет измерять каждую строку, а позиции и полоса прокрутки будут точными с первого рендера.

Sandbox Storybook

Динамическая высота ​

Без item-height компонент измеряет строки автоматически — подходит для контента переменной длины: комментариев, сообщений, описаний. Высоты уточняются по мере прокрутки, поэтому полоса прокрутки может слегка сдвигаться.

Sandbox Storybook

Безрамочный режим ​

Проп renderless убирает собственный скролл-контейнер: компонент слушает прокрутку ближайшего скроллируемого родителя, а строки рендерит без обёрток. Слот дополнительно получает itemRef — привяжите его к корневому узлу строки, чтобы компонент знал её высоту. Так список встраивается в уже существующую прокрутку — панели или всей страницы. Скроллируемому родителю задайте position: relative — от него компонент отсчитывает позиции строк.

Sandbox Storybook

Рекомендации ​

Сценарии использования ​

Поиск по каталогу ​

Передавайте в items уже отфильтрованный массив: computed пересчитывает записи по вводу, а компонент подхватывает новый список сам. item-key="id" привязывает строки к записям, а не к позициям в массиве — при фильтрации строки не перепутаются.

Sandbox Storybook

Быстрый переход по журналу ​

Компонент отдаёт метод scrollToIndex — получите его через ref и прокручивайте список программно. Кнопки месяцев считают индекс первой операции месяца; с фиксированным item-height переход попадает точно в нужную строку.

Sandbox Storybook

Выбор в длинном списке ​

Строки за пределами экрана не существуют в DOM, поэтому состояние выбора храните в данных, а не в самих строках. В демо отмеченные id лежат в Set: чекбокс строки читает его и меняет по клику — выбор переживает любую прокрутку.

Sandbox Storybook

API ​

CdsVirtualScroll ​

Пропсы

ИмяТипПо умолчаниюОписание
heightstring | number | undefined—Высота компонента
itemHeightstring | number | undefinednullВысота одного элемента в пикселях. Если не задана — высота измеряется автоматически.
itemKeySelectItemKeynullКлюч элемента для идентификации (имя поля, путь или функция). По умолчанию используется индекс.
itemsreadonly unknown[] | undefined[]Массив элементов, которые отрисовываются виртуальным скроллом.
maxHeightstring | number | undefined—Максимальная высота компонента
maxWidthstring | number | undefined—Максимальная ширина компонента
minHeightstring | number | undefined—Минимальная высота компонента
minWidthstring | number | undefined—Минимальная ширина компонента
renderlessboolean | undefined—Безрамочный режим: компонент не создаёт собственный скролл-контейнер, а использует ближайший скроллируемый родитель.
widthstring | number | undefined—Ширина компонента

Слоты

ИмяТипОписание
defaultCdsVirtualScrollSlot<any> & { itemRef?: TemplateRef | undefined; }Содержимое одного элемента списка. В режиме renderless дополнительно получает itemRef.

Exposed

ИмяТипОписание
calculateVisibleItems() => voidПересчитывает окно видимых элементов — нужно после изменения их высоты вне цикла обновления.
scrollToIndex(index: number) => voidПрокручивает список к элементу с указанным индексом.

CdsVirtualScrollItem ​

Пропсы

ИмяТипПо умолчаниюОписание
renderlessboolean | undefined—Безрамочный режим: элемент рендерит только содержимое слота без обёртки.

События

ИмяТипОписание
update:height[height: number]Сообщает виртуальному списку об изменении высоты элемента.

Слоты

ИмяТипОписание
default{ itemRef: TemplateRef; }Содержимое элемента. В режиме renderless получает itemRef для измерения высоты.