Skip to content

CdsList

Список показывает набор однотипных записей — разделы меню, документы, сотрудников, настройки — так, чтобы нужную было легко найти и выбрать. Собирается из массива items одной строкой либо из компонентов CdsListItem, когда строка сложнее заголовка с иконкой.

Storybook GitLab Figma
Покрытие тестами: 98% — хорошее покрытие
API в спеках
164 / 164 пропсы, события, слоты и exposed, у которых есть тест
Тест-кейсы
190 юнит · 5 браузерных
Известные баги
15 зафиксированы тестом it.fails
Покрытие кода
98.3% строк · 93% ветвей замер v4.0.0-alpha.13
A11y (axe)
35 рекомендаций в 17 историях замер v4.0.0-alpha.11

Для выбора значения в форме возьмите CdsSelect, для дерева с чекбоксами, асинхронной подгрузкой и перетаскиванием — CdsTree, для табличных данных со столбцами — CdsTable. Внутри CdsMenu, CdsSelect и CdsAutocomplete список уже используется — там его не нужно собирать вручную.

Анатомия ​

Первая схема — каркас списка: подзаголовки делят его на разделы, разделители отбивают блоки, группы раскрывают вложенные элементы. Вторая — устройство элемента: зоны prepend и append по краям и три текстовых блока между ними. Каждая зона доступна и как проп (prepend-icon, title), и как одноимённый слот.

Вариации ​

Данные списка ​

Свойство items принимает массив объектов и строит из него весь список. Поле title даёт заголовок, value — значение элемента (по нему список понимает, что выбрано), props — любые пропсы CdsListItem.

Sandbox Storybook

Когда данные приходят с сервера в своём формате, не перекладывайте их: item-title, item-value и item-children указывают, какие поля брать. Каждое из них принимает и имя поля, и функцию — так, например, item-props собирает пропсы элемента из нескольких полей объекта.

Sandbox Storybook

Поле props настраивает отдельный элемент: добавляет иконки, включает активное состояние или отключает строку.

Sandbox Storybook

Содержимое элемента ​

У элемента три текстовых блока: title называет запись, subtitle уточняет, description добавляет пояснение. По краям встают иконка (prepend-icon, append-icon) или аватар (prepend-avatar, append-avatar).

Sandbox Storybook

Свойство lines ограничивает подзаголовок и описание одной, двумя или тремя строками — остальной текст обрезается многоточием, и записи с разной длиной текста держат общий ритм. У three иконки в зонах prepend и append выравниваются по верху записи, а не по центру. :lines="false" снимает ограничение — текст займёт столько строк, сколько нужно.

Sandbox Storybook

Структура ​

Элементы с type: 'subheader' и type: 'divider' делят список на разделы: подзаголовок называет группу записей, разделитель отбивает блоки без заголовка.

Sandbox Storybook

Массив children внутри элемента превращает его в раскрывающуюся группу — список сам управляет её состоянием, а v-model:opened даёт им управлять снаружи. Вложенность не ограничена одним уровнем.

Sandbox Storybook

Выбор и активация ​

Свойство activatable подсвечивает один элемент как текущий — это про навигацию: «вы сейчас здесь». selectable включает выбор записей — это про данные: «эти отправить». Оба состояния читаются через v-model:activated и v-model:selected, а select-strategy задаёт, сколько элементов можно выбрать одновременно: single-leaf (по умолчанию) — один, independent — сколько угодно.

Sandbox Storybook

Внешний вид ​

nav скругляет активные элементы — вид бокового меню. slim убирает внутренние отступы, когда список лежит в узкой панели или выпадающем меню. color задаёт цвет активных элементов, bg-color — фон списка.

Sandbox Storybook

Сборка из компонентов ​

Когда строка сложнее заголовка с иконкой, соберите её из CdsListItem вручную — слоты принимают любые компоненты: теги, бейджи, аватары, кнопки.

Имя слотаОписание
prependСодержимое зоны перед текстом
titleСодержимое заголовка (замещает title)
subtitleСодержимое подзаголовка (замещает subtitle)
descriptionСодержимое описания (замещает description)
appendСодержимое зоны после текста
defaultПроизвольная разметка внутри элемента, под текстом
Sandbox Storybook

Вложенность в этом режиме собирается через CdsListGroup: слот activator отдаёт заголовок группы, содержимое по умолчанию — вложенные элементы. Проп subgroup помечает группу третьего и следующих уровней — стрелка раскрытия переезжает к началу строки.

Стрелку группа передаёт активатору как значение по умолчанию для append-icon, а слот append замещает эту зону целиком — поэтому со своим содержимым стрелка пропадёт. Верните её пустым <CdsIcon /> рядом: иконка возьмёт направление стрелки из дефолтов группы и продолжит переключаться при раскрытии.

Sandbox Storybook

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

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

Меню разделов ​

Боковое меню — это activatable плюс nav: активен ровно один пункт, mandatory запрещает снять выделение, а v-model:activated держит текущий раздел в состоянии приложения. Подзаголовки делят пункты на смысловые блоки.

Sandbox Storybook

Список документов с действиями ​

Строка целиком остаётся кликабельной, а действие в зоне append работает поверх неё — поэтому у кнопки стоит @click.stop, иначе клик дойдёт до элемента и выделит его. Статус рядом с кнопкой — обычный CdsTag.

Sandbox Storybook

Выбор получателей ​

Слот prepend получает isSelected и select — состояние выбора и функцию, которая его меняет. Это позволяет показать чекбокс, оставив клик по всей строке: CdsListItemAction выравнивает его по сетке элемента, а CdsAvatar встаёт следом.

Sandbox Storybook

Поиск по списку ​

Список перестраивается из отфильтрованного массива — отдельная логика ему не нужна. Когда совпадений нет, вместо пустого списка показывается CdsEmptyState: пользователь понимает, что дело в запросе, а не в загрузке.

Sandbox Storybook

API ​

CdsList ​

Пропсы

ИмяТипПо умолчаниюОписание
activatableboolean | undefined—Разрешает активацию элементов (выделение текущего элемента без режима выбора)
activatedany—Идентификаторы активных элементов (поддерживает v-model через update:activated)
activeClassstring | undefined—Класс, применяемый к элементам списка, когда они находятся в активном состоянии
activeColorstring | undefined—Цвет компонента, когда он находится в активном состоянии
activeStrategyActiveStrategyProp | undefined—Стратегия активации элементов (одиночная, множественная и т.д.)
baseColorstring | undefined—Цвет неактивного компонента
bgColorstring | undefined—Цвет фона компонента
collapseIconIconValue | undefined—Иконка, отображаемая у свёрнутой группы
colorstring | undefined—Цвет компонента
disabledboolean | null | undefinednullЗаблокированное состояние
expandIconIconValue | undefined—Иконка, отображаемая у раскрытой группы
filterableboolean | undefined—FOR INTERNAL USE ONLY Включает режим фильтрации: пробел не выбирает элемент, а используется для ввода. Применимо в компонентах CdsCombobox, CdsAutocomplete
heightstring | number | undefined—Высота компонента
indentstring | number | undefined—Величина отступа для вложенных групп элементов
itemChildrenSelectItemKey'children'Свойство объекта, содержащее дочерние элементы, либо функция для их получения
itemPropsSelectItemKey'props'Свойство объекта, содержащее пропсы для элемента, либо функция для их получения
itemsany[] | undefined[]Массив элементов для отображения
itemsRegistrationItemsRegistrationType | undefined'render'Стратегия регистрации элементов: render — по мере рендеринга, иначе единоразово
itemTitleSelectItemKey'title'Свойство объекта, используемое как заголовок элемента, либо функция для его получения
itemTypeSelectItemKey'type'Свойство объекта, определяющее тип элемента (item, divider, subheader), либо функция для его получения
itemValueSelectItemKey'value'Свойство объекта, используемое как значение элемента, либо функция для его получения
linesfalse | "one" | "two" | "three" | undefined'one'Количество строк в элементах списка, влияет на их высоту. false отключает фиксированную высоту
mandatoryboolean | undefined—Делает выбор обязательным: запрещает снимать выбор с последнего элемента
maxHeightstring | number | undefined—Максимальная высота компонента
maxWidthstring | number | undefined—Максимальная ширина компонента
minHeightstring | number | undefined—Минимальная высота компонента
minWidthstring | number | undefined—Минимальная ширина компонента
navboolean | undefined—Применяет стили навигационного списка (скруглённые активные элементы)
navigationIndexnumber | undefined—Индекс текущего элемента при клавиатурной навигации (поддерживает v-model)
navigationStrategy"focus" | "track" | undefined'focus'Стратегия клавиатурной навигации: focus — перенос фокуса, track — виртуальный курсор
openedany—Идентификаторы раскрытых групп (поддерживает v-model через update:opened)
openStrategyOpenStrategyProp | undefined'list'Стратегия раскрытия групп (list, single, multiple)
prependGapstring | number | undefined—Отступ перед контентом элемента (резервируется место под prepend-иконку/аватар)
requiredboolean | undefined—Делает выбор обязательным: запрещает снимать выбор с последнего элемента
returnObjectboolean | undefined—Возвращать в значении модели объект вместо массива
selectableboolean | undefined—Разрешает выбор элементов
selectedany—Идентификаторы выбранных элементов (поддерживает v-model через update:selected)
selectStrategySelectStrategyProp | undefined'single-leaf'Стратегия выбора элементов (single-leaf, leaf, independent, classic и т.д.)
slimboolean | undefined—Убирает внутренние отступы списка и контейнера меню: список полностью заполняет доступную область
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения
textColorstring | undefined—Цвет текста компонента
themestring | undefined—Тема компонента
valueComparatorValueComparator | undefined—Функция сравнения значений элементов для определения выбранного состояния
widthstring | number | undefined—Ширина компонента

События

ИмяТипОписание
click:activate[value: { id: unknown; value: boolean; path: unknown[]; }]Возникает при активации элемента. value — id элемента, его новое состояние и путь
click:open[value: { id: unknown; value: boolean; path: unknown[]; }]Возникает при клике по активатору группы. value — id группы, её новое состояние и путь
click:select[value: { id: unknown; value: boolean; path: unknown[]; }]Возникает при выборе элемента. value — id элемента, его новое состояние и путь
update:activated[value: unknown]Возникает при изменении набора активных элементов. value — идентификаторы активных элементов
update:navigationIndex[value: unknown]Возникает при изменении индекса клавиатурной навигации. value — новый индекс
update:opened[value: unknown]Возникает при изменении набора раскрытых групп. value — идентификаторы раскрытых групп
update:selected[value: unknown]Возникает при изменении набора выбранных элементов. value — идентификаторы выбранных элементов

Слоты

ИмяТипОписание
appendListItemSlot & { item: unknown; }Контент после текста элемента (на месте append-иконки/аватара)
defaultListItemSlot & { item: unknown; }Контент по умолчанию внутри элемента Контент по умолчанию. Переопределяет автоматический рендеринг элементов из items
descriptionListItemDescriptionSlot & { item: unknown; }Контент описания элемента (отображается под заголовком и подзаголовком)
divider{ props: { [key: string]: any; title: string; value: any; }; }Кастомный рендеринг разделителя при использовании items
header{ props: { [key: string]: any; title: string; value: any; }; }Кастомный рендеринг активатора группы (заголовка) при использовании items
item{ props: { [key: string]: any; title: string; value: any; } & { index: number; }; }Кастомный рендеринг элемента списка при использовании items
prependListItemSlot & { item: unknown; }Контент перед текстом элемента (на месте prepend-иконки/аватара)
subheader{ props: { [key: string]: any; title: string; value: any; }; }Кастомный рендеринг подзаголовка при использовании items
subtitleListItemSubtitleSlot & { item: unknown; }Контент подзаголовка элемента
titleListItemTitleSlot & { item: unknown; }Контент заголовка элемента

Exposed

ИмяТипОписание
childrenMap<unknown, unknown[]>Карта дочерних элементов по идентификаторам родителей
focus(location?: number | "next" | "prev" | "first" | "last" | undefined) => voidУстанавливает фокус на элемент списка (по индексу или ключевому слову: next, prev, first, last)
getPath(id: unknown) => unknown[]Возвращает путь (массив идентификаторов) до элемента по его id
open(id: unknown, value: boolean, event?: Event | undefined) => voidРаскрывает или сворачивает группу по её идентификатору
parentsMap<unknown, unknown>Карта родительских элементов по идентификаторам дочерних
select(id: unknown, value: boolean, event?: Event | undefined) => voidВыбирает или снимает выбор с элемента по его идентификатору

CdsListGroup ​

Пропсы

ИмяТипПо умолчаниюОписание
activeColorstring | undefined—Цвет компонента, когда он находится в активном состоянии
appendIconIconValue | undefined—Иконка, отображаемая после заголовка группы
baseColorstring | undefined—Цвет неактивного компонента
bgColorstring | undefined—Цвет фона компонента
collapseIconIconValue | undefined'chevron-up'Иконка, отображаемая когда группа свёрнута
colorstring | undefined—Цвет компонента
disabledboolean | null | undefinednullЗаблокированное состояние
expandIconIconValue | undefined'chevron-down'Иконка, отображаемая когда группа раскрыта
fluidboolean | undefined—Убирает отступ у активатора группы, выравнивая его по краю списка
prependIconIconValue | undefined—Иконка, отображаемая перед заголовком группы
rawIdstring | number | undefined—Исходный идентификатор группы, используется для построения id DOM-элемента
subgroupboolean | undefined—Помечает компонент как группу вложенных списков (подгруппу)
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения
textColorstring | undefined—Цвет текста компонента
titlestring | undefined—Заголовок группы, отображаемый в активаторе по умолчанию
valueany—Значение группы, используемое в логике раскрытия/выбора

Слоты

ИмяТипОписание
activatorCdsListGroupActivatorSlotАктиватор группы — заголовок, по клику на который группа раскрывается/сворачивается
defaultanyКонтент группы (вложенные элементы списка)

Exposed

ИмяТипОписание
isOpenbooleanПризнак того, что группа раскрыта

CdsListItem ​

Пропсы

ИмяТипПо умолчаниюОписание
activeboolean | undefined—Принудительно задаёт активное состояние элемента
activeClassstring | undefined—Класс, применяемый к элементам списка, когда они находятся в активном состоянии
activeColorstring | undefined—Цвет компонента, когда он находится в активном состоянии
appendAvatarstring | undefined—Аватар (URL изображения), отображаемый после контента элемента
appendIconIconValue | undefined—Иконка, отображаемая после контента элемента
baseColorstring | undefined—Цвет неактивного компонента
bgColorstring | undefined—Цвет фона компонента
colorstring | undefined—Цвет компонента
descriptionstring | number | boolean | undefined—Описание элемента списка, отображаемое под заголовком и подзаголовком
disabledboolean | null | undefinednullЗаблокированное состояние
exactboolean | undefined—Если true, активное состояние будет применяться только при точном совпадении маршрута
heightstring | number | undefined—Высота компонента
hrefstring | undefined—Атрибут href для ссылки. Если указан, компонент будет вести себя как обычная ссылка
indexnumber | undefined—Индекс элемента, используется для клавиатурной навигации
linesfalse | "one" | "two" | "three" | undefined'one'Количество строк в элементах списка, влияет на их высоту. false отключает фиксированную высоту
linkboolean | undefined—Делает элемент кликабельной ссылкой. Определяется автоматически при наличии href/to
maxHeightstring | number | undefined—Максимальная высота компонента
maxWidthstring | number | undefined—Максимальная ширина компонента
minHeightstring | number | undefined—Минимальная высота компонента
minWidthstring | number | undefined—Минимальная ширина компонента
navboolean | undefined—Применяет стили навигационного списка (скруглённые активные элементы)
prependAvatarstring | undefined—Аватар (URL изображения), отображаемый перед контентом элемента
prependGapstring | number | undefined—Отступ перед контентом элемента (резервируется место под prepend-иконку/аватар)
prependIconIconValue | undefined—Иконка, отображаемая перед контентом элемента
replaceboolean | undefined—Если true, навигация по маршруту будет заменять текущую запись в истории вместо добавления новой
slimboolean | undefined—Убирает внутренние отступы списка и контейнера меню: список полностью заполняет доступную область
subtitlestring | number | boolean | undefined—Подзаголовок элемента, отображаемый под заголовком
tabindexstring | number | undefined—Значение атрибута tabindex элемента
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения
textColorstring | undefined—Цвет текста компонента
themestring | undefined—Тема компонента
titlestring | number | boolean | undefined—Заголовок элемента, отображаемый в компоненте
toLinkTo | undefined—Маршрут назначения или объект для RouterLink. Если указан, компонент будет вести себя как RouterLink
valueany—Значение элемента, используемое при выборе/активации в списке
widthstring | number | undefined—Ширина компонента

События

ИмяТипОписание
click[value: MouseEvent | KeyboardEvent]Возникает при клике по элементу списка

Слоты

ИмяТипОписание
appendListItemSlotКонтент после текста элемента (на месте append-иконки/аватара)
defaultListItemSlotКонтент по умолчанию внутри элемента
descriptionListItemDescriptionSlotКонтент описания элемента (отображается под заголовком и подзаголовком)
prependListItemSlotКонтент перед текстом элемента (на месте prepend-иконки/аватара)
subtitleListItemSubtitleSlotКонтент подзаголовка элемента
titleListItemTitleSlotКонтент заголовка элемента

Exposed

ИмяТипОписание
activate(activated: boolean, e?: Event | undefined) => voidАктивирует или деактивирует элемент
isActivatedbooleanПризнак того, что элемент находится в активном состоянии
isGroupActivatorboolean | undefinedПризнак того, что элемент является активатором группы
isSelectedbooleanПризнак того, что элемент выбран
list{ filterable: MaybeRefOrGetter<boolean>; hasPrepend: Ref<boolean, boolean>; updateHasPrepend: (value: boolean) => void; trackingIndex: Ref<number, number>; navigationStrategy: Ref<"focus" | "track", "focus" | "track">; uid: string; } | nullКонтекст родительского списка (CdsList)
rootNestedRootКорневой контекст вложенности (root) родительского списка
select(selected: boolean, e?: Event | undefined) => voidВыбирает или снимает выбор с элемента

CdsListItemAction ​

Пропсы

ИмяТипПо умолчаниюОписание
endboolean | undefined—Размещает действие в конце элемента списка (после контента)
startboolean | undefined—Размещает действие в начале элемента списка (перед контентом)
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения

Слоты

ИмяТипОписание
defaultanyКонтент действия по умолчанию

CdsListItemDescription ​

Пропсы

ИмяТипПо умолчаниюОписание
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения

CdsListItemDivider ​

Пропсы

ИмяТипПо умолчаниюОписание
colorstring | undefined—Цвет разделителя.
contentOffsetstring | number | (string | number)[] | undefined—Увеличивает интервал между элементами контента и строками. Если передается в виде массива, второе значение смещает содержимое слота вниз (или вправо если vertical = true).
gradientboolean | undefined—Добавляет эффект затухания с обеих сторон.
insetboolean | undefined—Добавляет отступ для обычных разделителей и уменьшает максимальную высоту для вертикальных разделителей.
lengthstring | number | undefined—Длина разделителя. Единица измерения по умолчанию — пиксели.
opacitystring | number | undefined—Прозрачность разделителя.
themestring | undefined—Тема компонента
thicknessstring | number | undefined—Толщина разделителя. Единица измерения по умолчанию — пиксели.
variant"solid" | "dotted" | "dashed" | "double" | undefined'solid'Вариант отображения разделителя
verticalboolean | undefined—Отображает разделитель вертикально

Слоты

ИмяТипОписание
defaultanyТекст или контент в разрыве разделителя

CdsListItemImage ​

Пропсы

ИмяТипПо умолчаниюОписание
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения

CdsListItemMedia ​

Пропсы

ИмяТипПо умолчаниюОписание
endboolean | undefined—Размещает медиа в конце элемента списка (после контента)
startboolean | undefined—Размещает медиа в начале элемента списка (перед контентом)
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения

Слоты

ИмяТипОписание
defaultanyКонтент медиа по умолчанию

CdsListItemSubtitle ​

Пропсы

ИмяТипПо умолчаниюОписание
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения

CdsListItemTitle ​

Пропсы

ИмяТипПо умолчаниюОписание
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения

CdsListSubheader ​

Пропсы

ИмяТипПо умолчаниюОписание
colorstring | undefined—Цвет текста подзаголовка
insetboolean | undefined—Добавляет отступ слева, выравнивая текст с контентом элементов списка
stickyboolean | undefined—Закрепляет подзаголовок вверху при прокрутке списка
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения
titlestring | undefined—Текст подзаголовка

Слоты

ИмяТипОписание
defaultanyКонтент подзаголовка по умолчанию (переопределяет проп title)