CustomSelect

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

Связанные компоненты:

Загружается...

Компонент поддерживает работу как в неконтролируемом режиме, так и контролируемом. Это стандартное поведение React-компонентов, прочитать про это можно в документации React ↗.

Для использования неконтролируемого режима достаточно просто не передавать value или передавать defaultValue, если требуется задать значение по умолчанию. Для контролируемого режима используйте связку свойств value/onChange для задания значения и его изменения.

const colors = [
  {
    value: 'red',
    label: 'Красный',
  },
  {
    value: 'green',
    label: 'Зелёный',
  },
  {
    value: 'blue',
    label: 'Синий',
  },
];
 
// Неконтролируемое состояние
<CustomSelect options={colors} defaultValue="red" />;
 
// Контролируемое состояние
const [color, setColor] = React.useState('red');
 
<CustomSelect options={colors} value={color} onChange={(_, newColor) => setColor(newColor)} />;

Свойство disabled блокирует взаимодействие с компонентом и добавляет визуальную индикацию недоступности.

Загружается...

Свойство status используется для визуализации валидации компонента - некорректности заполненного поля (значение "error") или успешной валидации (значение "valid").

Загружается...

С помощью свойства renderOption можно влиять на отображение конкретного элемента выпадающего списка. Вы можете изменить стандартный компонент CustomSelectOption или использовать свой компонент.

Загружается...

Универсальный компонент для отрисовки одного из значений в выпадающем списке. Передавайте данный компонент в свойство renderOption, для кастомизации значений выпадающего списка. Помимо CustomSelect используется и в ChipsSelect.

Загружается...

Для реализации многоуровневых CustomSelectOption используйте свойство hierarchy, которое позволяет создать нужный отступ в зависимости от уровня вложенности.

Загружается...

Для поиска компонента и его элементов на странице cуществует ряд вспомогательных свойств:

По умолчанию все data-* атрибуты попадают на <input> компонента, это значит, что при передаче data-testid или data-test-id идентификатор попадёт <input>. Доступ к полю ввода может быть полезен для:

  • получения текста, введённого пользователем при поиске опций, в режиме searchable;
  • получения информации о наличии фокуса на компоненте;
  • симуляции работы с компонентом с клавиатуры.

Используйте labelTextTestId:

  • для симуляции работы с компонентом с помощью мыши, тач-устройства;
  • для получения текста выбранной в данный момент опции.

Для взаимодействия с кнопкой очистки состояния компонента, которая появляется, если CustomSelect имеет свойство searchable и пользователь выбрал опцию, используйте свойство clearButtonTestId.

CustomSelect внутри себя хранит невидимый <select>, для того, чтобы CustomSelect можно было использовать внутри формы. Для получения доступа к <select> используйте свойство nativeSelectTestId. Полезно для доступа к значению value, выбранной в данный момент опции.

Все перечисленные выше свойства устанавливают аттрибут data-testid у соответствующих элементов. Учитывайте это при построении селекторов.

Следуйте рекомендациям доступности компонента Select.

Для того, чтобы уведомить пользователей скринридеров о том, что идет загрузка списка опций использутся специальные текстовые метки совместно со свойством fetching. Текст этих меток можно переопределить с помощью свойств fetchingInProgressLabel и fetchingCompletedLabel. По умолчанию они соответственно: "Список опций загружается..." и "Опций загружено: ${options.length}"

В текущей реализации (v7) компонент CustomSelect имеет проблему с доступностью в некоторых скринридерах (например, NVDA): пользователь не может узнать, какой вариант выбран. Это происходит из-за сброса значения в input при потере фокуса.

Такое поведение было добавлено для ускорения ввода новых значений, но оно негативно влияет на доступность.

Мы изменили логику работы компонента. Чтобы включить исправленное поведение, используйте флаг accessible. Он введён для сохранения обратной совместимости в минорных обновлениях.

Настоятельно рекомендуем включить этот флаг, так как в v8 он будет включён по умолчанию (accessible: true).

СвойствоОписание
accessibleboolean

Включает режим в котором выбранное значение CustomSelect читается скринридерами корректно. В данном режиме введенное в поле ввода значение не сбрасывается при потере фокуса.

По умолчанию: -
afterReactNode

Добавляет иконку справа.

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

  • Используйте следующие размеры иконок 12 | 16 | 20 | 24 | 28.
  • Используйте IconButton ↗, если вам нужна иконка, реагируюущая на нажатие.
По умолчанию: -
afterAlignFieldIconsAlign

Вертикальное выравнивание иконки справа.

По умолчанию: -
alignAlignType
По умолчанию: -
allowClearButtonboolean

Если true, то справа будет отображаться кнопка для очистки значения.

По умолчанию: -
beforeReactNode

Добавляет иконку слева.

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

  • Используйте следующие размеры иконок 12 | 16 | 20 | 24 | 28.
  • Используйте IconButton ↗, если вам нужна иконка, реагирующая на нажатие.
По умолчанию: -
beforeAlignFieldIconsAlign

Вертикальное выравнивание иконки слева.

По умолчанию: -
ClearButtonComponentType<CustomSelectClearButtonProps>

Кастомная кнопка для очистки значения. Должна принимать обязательное свойство onClick.

По умолчанию: -
clearButtonTestIdstring

Передает атрибут data-testid для кнопки очистки.

По умолчанию: -
defaultValueSelectValue

См. value.

По умолчанию: -
dropdownAutoWidthboolean

Ширина раскрывающегося списка зависит от контента.

По умолчанию: -
dropdownOffsetDistancenumber

Отступ от выпадающего списка.

По умолчанию: -
emptyTextstring

Текст, который будет отображен, если приходит пустой options.

По умолчанию: -
fetchingboolean

Если true, то в дропдауне вместо списка опций рисуется спиннер. При переданных renderDropdown и fetching: true “победит” renderDropdown.

По умолчанию: false
fetchingCompletedLabelstring | ((optionsCount: number) => string)

Текстовая метка для индикации завершения процесса загрузки данных для пользователей скринридерами. По умолчанию: "Загружено опций: ${options.length}".

По умолчанию: `Загружено опций: ${options.length}`
fetchingInProgressLabelstring

Текстовая метка для индикации процесса загрузки данных для пользователей скринридерами. По умолчанию: "Список опций загружается...".

По умолчанию: Список опций загружается...
filterFnfalse | FilterFn<OptionInterfaceT>

Функция для кастомной фильтрации. По умолчанию поиск производится по option.label.

По умолчанию: -
forceDropdownPortalboolean

Использовать Portal для рендеринга выпадающего списка.

По умолчанию: -
getRefRef<HTMLSelectElement>
По умолчанию: -
getRootRefRef<HTMLDivElement>
По умолчанию: -
getSelectInputRefRef<HTMLInputElement>

Ref на внутрений компонент input.

По умолчанию: -
iconReactNode

Иконка раскрывающегося списка.

По умолчанию: -
labelTextTestIdstring

Передает атрибут data-testid для элемента, внутри которого отображается текст выбранной опции CustomSelect или плейсхолдер.

По умолчанию: -
mode"default" | "plain"

Режим отображения.

  • default — показывает фон, обводку и, при наличии, текст-подсказку.
  • plain — показывает только текст-подсказку.
По умолчанию: -
multilineboolean

Флаг для включения многострочного режима.

По умолчанию: -
nativeSelectTestIdstring

Передает атрибут data-testid для нативного элемента select.

По умолчанию: -
noMaxHeightboolean

Отключает максимальную высоту по умолчанию.

По умолчанию: -
onChange((e: ChangeEvent<HTMLSelectElement>, newValue: SelectValue) => void)

Обработчик, срабатывающий при изменении выбранного значения. Вторым параметром прокидывается новое значение.

По умолчанию: -
onCloseVoidFunction

Обработчик закрытия выпадающего списка.

По умолчанию: -
onInputChange((e: ChangeEvent<HTMLInputElement>) => void)

Событие изменения текстового поля.

По умолчанию: -
onInputKeyDown((e: KeyboardEvent<Element>, isOpen: boolean) => void)

Обработчик события keyDown в поле ввода.

По умолчанию: -
onOpenVoidFunction

Обработчик открытия выпадающего списка.

По умолчанию: -
optionsOptionInterfaceT[]

Список опций в списке.

По умолчанию: -
overscrollBehavior"auto" | "none" | "contain"

Поведение overscroll, подробнее можно почитать в документации ↗.

По умолчанию: -
placeholderstring

Текст-подсказка при отсутствии выбранного значения.

По умолчанию: -
popupDirectionPopupDirection

Направление раскрытия выпадающего списка.

По умолчанию: -
renderDropdown(({ defaultDropdownContent, }: { defaultDropdownContent: ReactNode; }) => ReactNode)

Рендер-проп для кастомного рендера содержимого дропдауна. В defaultDropdownContent содержится список опций в виде скроллящегося блока.

По умолчанию: -
renderOption((props: CustomSelectRenderOption<OptionInterfaceT>) => ReactNode)

Рендер-проп для кастомного рендера опции. В объекте аргумента приходят свойства опции ↗.

По умолчанию: -
searchableboolean

Если true, то при нажатии на CustomSelect в нём появится текстовое поле для поиска по options. По умолчанию поиск производится по option.label.

По умолчанию: -
selectTypeSelectType

Тип отображения компонента.

По умолчанию: -
status"default" | "error" | "valid"

Статус отображения поля в форме.

По умолчанию: -
valueSelectValue

Выбранное значение.

По умолчанию: -
СвойствоОписание
afterReactNode

Вставляет элемент в конец блока после основного контента. Например, можно передать компонент Avatar, Icon<Name> или другие изображения.

По умолчанию: -
beforeReactNode

Вставляет элемент в начало блока перед основным контентом. Например, можно передать компонент Avatar, Icon<Name> или другие изображения.

По умолчанию: -
descriptionReactNode

Добавляет описание под основным блоком.

По умолчанию: -
disabledboolean

Блокирует весь блок.

По умолчанию: -
focusedboolean

Включает состояние фокуса.

По умолчанию: -
getRootRefRef<HTMLDivElement>
По умолчанию: -
hierarchynumber

Позволяет создавать вложенность.

По умолчанию: 0
hoveredboolean

Включает состояние наведения.

По умолчанию: -
selectedboolean

Включает состояние выбранного элемента списка.

По умолчанию: -