Skip to content

CdsSelect

Селект открывает выпадающий список и позволяет выбрать одно или несколько значений из заранее известного набора: страну, статус, категорию. Поле построено на CdsTextInput, поэтому лейбл, описание, сообщения, валидация и состояния работают так же, как в текстовом поле.

Storybook GitLab Figma
Покрытие тестами: 64% — частичное покрытие
API в спеках
127 / 127 пропсы, события, слоты и exposed, у которых есть тест
Тест-кейсы
80 юнит · 10 браузерных · 1 в планах
Известные баги
11 зафиксированы тестом it.fails
Покрытие кода
64.1% строк · 61.4% ветвей замер v4.0.0-alpha.13
A11y (axe)
5 рекомендаций в 18 историях замер v4.0.0-alpha.11

Для двух-трёх вариантов возьмите CdsRadioGroup — опции видны сразу. Если список длинный и пользователь ищет вводом текста, подойдёт CdsAutocomplete, а если допускаются значения вне списка — CdsCombobox.

Анатомия ​

Первая схема — каркас компонента: лейбл, описание, поле и блок сообщений. Вторая — устройство самого поля: зона выбранных значений, кнопка очистки и индикатор меню; внутренние и внешние зоны иконок — те же, что у CdsTextInput.

Вариации ​

Элементы списка ​

Список задаёт проп items — массив строк или объектов с тем же интерфейсом, что у CdsList. Пока значение не выбрано, поле показывает placeholder.

Sandbox Storybook

Свои поля данных ​

Когда объекты приходят с сервера как есть, укажите через item-title и item-value, из каких полей брать заголовок и значение. return-object кладёт в v-model весь объект целиком, а не только значение.

Sandbox Storybook

Группировка ​

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

Sandbox Storybook

Множественный выбор ​

Свойство multiple разрешает выбрать несколько значений: у элементов появляются чекбоксы, а поле перечисляет выбранное через запятую. ellipsis удерживает перечисление в одну строку и обрезает лишнее многоточием.

Sandbox Storybook

Выбор всех значений ​

Свойство is-select-all добавляет первым пунктом списка «Выбрать все» (работает вместе с multiple). Значение true использует надпись по умолчанию, строка задаёт собственную.

Sandbox Storybook

Чипы ​

Свойство chips показывает выбранные значения тегами CdsTag, closable-chips добавляет им крестик — значение снимается прямо в поле, без открытия меню.

Sandbox Storybook

Нативный список ​

Свойство native-select заменяет кастомное меню нативным <select>: на мобильных устройствах системный список привычнее. Фильтрация, виртуальная прокрутка и слоты меню в этом режиме не работают.

Sandbox Storybook

Настройка списка ​

Проп list-props прокидывает любые пропсы внутреннему CdsList — в примере bgColor красит фон меню, а slim убирает внутренние отступы меню, и список заполняет его целиком. item-color задаёт цвет выбранных элементов (по умолчанию берётся color). Точно так же menu-props настраивает внутренний CdsMenu, а menu-height ограничивает высоту меню.

Sandbox Storybook

Слоты ​

Селект отдаёт под замену каждую часть меню и поля. Слоты самого поля — те же, что у CdsTextInput.

Имя слотаОписание
itemЭлемент списка целиком; получает item, index и props
selectionВыбранное значение в поле
chipЧип выбранного значения (при chips)
prepend-item / append-itemКонтент до и после списка
no-dataКонтент меню при пустом списке
subheader / dividerПодзаголовок и разделитель группы
menu-header / menu-footerШапка и подвал меню; получают search и filteredItems

Слот item переопределяет отрисовку элемента полностью. Обязательно передайте props в CdsListItem — в них живёт обработчик выбора. В примере у каждой страны выводится флаг и столица.

Sandbox Storybook

Слот selection — своё отображение выбранного в поле: первые две страны выводятся тегами, остальные сворачиваются в счётчик.

Sandbox Storybook

Слоты prepend-item и append-item добавляют собственные пункты в начало и конец списка. В примере в начале — «Выбрать все страны» с чекбоксом, в конце — «Добавить еще» с имитацией подгрузки через loading.

Sandbox Storybook

Слоты menu-header и menu-footer добавляют контент в шапку и подвал меню — например, поле поиска и кнопку подтверждения. В оба слота приходят search (записывается в v-model:search и фильтрует список) и filteredItems.

Sandbox Storybook

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

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

Отправка формы ​

Селект участвует в валидации CdsForm наравне с текстовыми полями: rules не пропустит форму без выбранной темы. Необязательным полям задавайте значение по умолчанию — так форма заполняется быстрее.

Sandbox Storybook

Зависимые списки ​

Список городов зависит от выбранной страны: пока страны нет, второй селект выключен через disabled, во время загрузки вариантов показывает loading. При смене страны выбранный город сбрасывается — иначе в форме останется несуществующая пара.

Sandbox Storybook

Выбор исполнителей ​

Сочетание multiple, chips и closable-chips показывает выбранных людей тегами и снимает их крестиком прямо в поле. Слот item добавляет аватар и роль — так проще найти нужного человека в длинном списке.

Sandbox Storybook

Сортировка результатов ​

Компактный селект управляет порядком списка: hide-messages убирает нижний блок, aria-label заменяет скрытый лейбл для скринридеров. Выбор применяется сразу — кнопка «Применить» не нужна.

Sandbox Storybook

API ​

Пропсы

ИмяТипПо умолчаниюОписание
activeboolean | undefined—Активное состояние поля
activeColorstring | undefined—Цвет компонента, когда он находится в активном состоянии
appendIconIconValue | undefined—Иконка в слоте append после контента
appendInnerIconIconValue | undefined—Иконка во внутреннем слоте append после содержимого поля
autocompletestring | undefined—Помогает влиять на предложения браузера. Значение «suppress» изменяет атрибут name полей, а значение «off» полагается на то, что браузер по собственной инициативе перестанет предлагать значения. Любое другое значение передается встроенной функции автозаполнения для соответствующего элемента.
autofocusboolean | undefined—Включает автофокус
baseColorstring | undefined—Цвет неактивного компонента
bgColorstring | undefined—Цвет фона компонента
centerAffixboolean | undefined—Выровнять по вертикали элементы appendInner, prependInner, clearIcon и label по центру.
chipsboolean | undefined—Отображает выбранные значения в виде удаляемых чипов (CdsTag).
clearableboolean | undefined—Отображать кнопку очистки значения
clearIconIconValue | undefined'remove'Иконка кнопки очистки
closableChipsboolean | undefined—Добавляет чипам кнопку удаления (актуально вместе с chips).
closeTextstring | undefined'$cds.close'Текст для скринридеров, описывающий действие закрытия меню.
colorstring | undefined—Цвет компонента
counterstring | number | boolean | undefined—Счетчик символов. Принимает булево значение, число или строку
counterValuenumber | ((value: any) => number) | undefined—Пользовательское значение счетчика. Может быть числом или функцией вычисления от текущего значения
customFilterFilterFunction | undefined—Своя функция фильтрации значений. Получает значение, поисковый запрос и элемент, возвращает совпадение или -1
customKeyFilterFilterKeyFunctions | undefined—Отдельные функции фильтрации для конкретных ключей элемента — объект вида { ключ: функция }
descriptionstring | undefined—Описание компонента, отображаемое под меткой
disabledboolean | null | undefinednullЗаблокированное состояние
eagerboolean | undefined—Рендерит контент меню заранее, не дожидаясь первого открытия.
ellipsisboolean | undefined—В режиме multiple удерживает выбранные значения в одну строку с многоточием
errorboolean | undefined—Состояние ошибки
errorMessagesstring | readonly string[] | null | undefined[]Отображает компонент в состояние ошибки и передает пользовательские сообщения об ошибках. Будет объединяться с любыми проверками, заданными в свойстве rules. Это поле не запускает валидацию.
filterKeysFilterKeys | undefined—Ключи элемента, по которым идёт поиск. По умолчанию фильтрация идёт по заголовку элемента
filterModeFilterMode | undefined'intersection'Как объединяются результаты customKeyFilter и общей фильтрации: пересечением, объединением или заменой
focusedboolean | undefined—Управляет состоянием фокуса компонента. Когда true, компонент считается сфокусированным и может применять соответствующие стили или поведение.
hideDetailsboolean | "auto" | undefined—Скрытие блока с деталями (сообщениями и подсказками). При значении 'auto' блок скрывается, если нет сообщений
hideMessagesboolean | undefined—Скрыть сообщения под полем ввода
hideNoDataboolean | undefined—Скрывает меню и плейсхолдер «нет данных», когда список элементов пуст.
hideSelectedboolean | undefined—Скрывает уже выбранные элементы из списка меню.
hintstring | undefined—Текст подсказки, отображаемый под полем ввода
iconColorstring | boolean | undefined—Цвет иконки. Принимает булево значение или строку с цветом
idstring | undefined—Уникальный идентификатор компонента
isSelectAllstring | boolean | undefinedfalseДобавляет первым элементом списка пункт «Выбрать все» (только для multiple). true использует надпись по умолчанию $cds.selectAll, строка задаёт собственную надпись.
itemChildrenSelectItemKeyfalseСвойство объекта, содержащее дочерние элементы, либо функция для их получения
itemColorstring | undefined—Цвет выбранных элементов в списке меню. По умолчанию используется color.
itemPropsSelectItemKey'props'Свойство объекта, содержащее пропсы для элемента, либо функция для их получения
itemsany[] | undefined[]Массив элементов для отображения
itemTitleSelectItemKey'title'Свойство объекта, используемое как заголовок элемента, либо функция для его получения
itemTypeSelectItemKey'type'Свойство объекта, определяющее тип элемента (item, divider, subheader), либо функция для его получения
itemValueSelectItemKey'value'Свойство объекта, используемое как значение элемента, либо функция для его получения
labelstring | undefined—Текст метки (label) компонента
listPropsCdsListProps | undefined—Пропсы, прокидываемые во внутренний компонент CdsList.
loadingstring | boolean | undefined—Индикатор загрузки для компонента
maxErrorsstring | number | undefined1Максимальное число отображаемых ошибок при валидации
maxWidthstring | number | undefined—Максимальная ширина компонента
menuboolean | undefined—Управляет состоянием открытия выпадающего меню (v-model:menu).
menuHeightstring | number | undefined178Максимальная высота выпадающего меню.
menuIconIconValue | undefined'chevron-down'Иконка-индикатор раскрытия меню.
menuPropsCdsMenuProps | undefined—Пропсы, прокидываемые во внутренний компонент CdsMenu.
messagesstring | readonly string[] | undefined[]Сообщения для отображения под полем ввода
minWidthstring | number | undefined—Минимальная ширина компонента
modelModifiersRecord<string, boolean> | undefined—Модификаторы v-model, переданные Vue для обработки значения поля
modelValueanynullЗначение компонента в v-model. Если компонент поддерживает свойство multiple, по умолчанию используется пустой массив.
multipleboolean | undefined—Разрешает выбор нескольких значений. Выбранные элементы отображаются чипами или списком.
namestring | undefined—Имя поля ввода
nativeSelectboolean | undefined—Отображает нативный HTML-select вместо кастомного выпадающего меню (CdsMenu)
noAutoScrollboolean | undefined—Отключает автоматическую прокрутку меню к выбранному элементу при открытии.
noDataTextstring | undefined'$cds.noDataText'Текст, отображаемый в меню, когда список элементов пуст.
noFilterboolean | undefined—Отключает встроенную фильтрацию — список показывается как есть, поиск обрабатывается снаружи
openOnClearboolean | undefined—Открывает меню после очистки значения.
openTextstring | undefined'$cds.open'Текст для скринридеров, описывающий действие открытия меню.
persistentClearableboolean | undefined—Всегда отображать кнопку очистки, а не только при наведении или фокусе
persistentCounterboolean | undefined—Всегда отображать счетчик, а не только при взаимодействии с полем
persistentHintboolean | undefined—Всегда отображать подсказку, а не только при фокусе
persistentPlaceholderboolean | undefined—Всегда отображать placeholder, а не скрывать его при взаимодействии с полем
placeholderstring | undefined—Текст-заполнитель, отображаемый в пустом поле
prefixstring | undefined—Текстовый префикс, отображаемый перед значением поля
prependIconIconValue | undefined—Иконка в слоте prepend перед контентом
prependInnerIconIconValue | undefined—Иконка во внутреннем слоте prepend перед содержимым поля
readonlyboolean | null | undefinednullТолько для чтения
returnObjectboolean | undefined—Возвращать в значении модели объект вместо массива
reverseboolean | undefined—Обратный порядок расположения элементов внутри поля
rolestring | undefined'combobox'ARIA-роль для нативного элемента ввода
rulesreadonly ValidationRule[] | undefined[]Принимает массив, состоящий из элементов различных типов: функций, логических значений и строк. Функции принимают входное значение в качестве аргумента и должны возвращать либо true / false, либо строку, содержащую сообщение об ошибке. Поле ввода перейдет в состояние ошибки, если функция возвращает значение false (или любое значение в массиве содержит false) либо является строкой.
searchstring | undefined—Текущее значение поискового запроса для фильтрации элементов (v-model:search).
sizenumber | "xs" | "sm" | "md" | "lg" | "xl" | undefined'md'Размер компонента
suffixstring | undefined—Текстовый суффикс, отображаемый после значения поля
textColorstring | undefined—Цвет текста компонента
themestring | undefined—Тема компонента
transitionstring | boolean | (TransitionProps & { component?: Component | undefined; }) | { component: Component; } | null | undefined{ component: CdsModalTransition }Анимация перехода
typestring | undefined'text'Тип нативного поля ввода
validateOnValidateOn | undefined—Изменяет тип события, при котором запускается валидация
valueComparatorValueComparator | undefined—Функция сравнения значений элементов для определения выбранного состояния
widthstring | number | undefined—Ширина компонента

События

ИмяТипОписание
update:focused[focused: boolean]Изменение состояния фокуса компонента (v-model:focused).
update:menu[ue: boolean]Изменение состояния открытия выпадающего меню (v-model:menu).
update:modelValue[value: any]Изменение выбранного значения (v-model).
update:search[value: string]Изменение поискового запроса (v-model:search).
update:selectedAll[value: boolean]Изменение состояния «выбраны все» (только для multiple + isSelectAll).

Слоты

ИмяТипОписание
appendCdsInputSlotДобавляет элемент после поля ввода
append-innerCdsInputDefaultSlotСлот, добавляемый в конце инпута ввода
append-itemanyКонтент после списка элементов в меню.
chip{ item: any; internalItem: ListItem<any>; index: number; props: Record<string, unknown>; }Кастомный рендеринг чипа выбранного значения (актуально вместе с chips).
clearCdsInputDefaultSlot & { props: Record<string, any>; }Слот для пользовательского иконки очистки (отображается, когда свойство clearable имеет значение «true»).
description{ description: string | undefined; props: Record<string, any>; }Слот по умолчанию для компонента CdsDescription
detailsCdsInputSlotСлот для ввода пользовательских данных, позволяющее настраивать отображение сообщений
divider{ props: Record<string, unknown>; index: number; }Кастомный рендеринг разделителя в списке меню.
item{ item: any; internalItem: ListItem<any>; index: number; props: Record<string, unknown>; }Кастомный рендеринг элемента списка в меню.
label{ label: string | undefined; props: Record<string, any>; }Слот по умолчанию для компонента CdsLabel
loaderLoaderSlotPropsСлот для пользовательского загрузчика (отображается, если свойство loading имеет значение true).
menu-footer{ search: Ref<string | undefined, string | undefined>; filteredItems: ListItem<any>[]; }Контент подвала меню. Получает текущий поисковый запрос и отфильтрованные элементы.
menu-header{ search: Ref<string | undefined, string | undefined>; filteredItems: ListItem<any>[]; }Контент шапки меню. Получает текущий поисковый запрос и отфильтрованные элементы.
messageCdsMessageSlotСлот для настройки содержания сообщения
messagesCdsInputSlotСлот для ввода пользовательских данных, позволяющее настраивать отображение сообщений
no-dataanyКонтент, отображаемый в меню, когда список элементов пуст.
prependCdsInputSlotДобавляет элемент до поля ввода
prepend-innerCdsInputDefaultSlotСлот, добавляемый в начало инпута ввода
prepend-itemanyКонтент перед списком элементов в меню.
selection{ item: any; internalItem: ListItem<any>; index: number; }Кастомный рендеринг выбранного значения в поле ввода.
subheader{ props: Record<string, unknown>; index: number; }Кастомный рендеринг подзаголовка группы в списке меню.

Exposed

ИмяТипОписание
controlRefHTMLElement | undefinedRef-ссылка на контролл поля ввода
fieldIconColorstring | undefinedЦвет иконки
filteredItemsListItem<any>[]Элементы, отфильтрованные по текущему поисковому запросу.
isDirtybooleanЯвляется ли поле ввода "грязным"
isDisabledbooleanЯвляется ли поле ввода заблокированным
isFocusedbooleanНаходится ли компонент в фокусе.
isPurebooleanЯвляется ли поле ввода "чистым"
isReadonlybooleanЯвляется ли поле ввода только для чтения
isValidboolean | nullЯвляется ли поле ввода валидным
isValidatingbooleanЯвляется ли поле ввода в процессе валидации
reset() => Promise<void>Функция сброса поля ввода в исходное состояние
resetValidation() => Promise<void>Функция сброса валидации поля ввода
selectAll() => voidПереключить выбор всех доступных элементов (только для multiple + isSelectAll).
validate(silent?: boolean) => Promise<string[]>Функция валидации поля ввода