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
Свойство disabled
блокирует взаимодействие с компонентом и добавляет визуальную индикацию недоступности.
Валидация
Свойство status
используется для визуализации валидации компонента - некорректности заполненного поля (значение "error"
)
или успешной валидации (значение "valid"
).
Кастомизация
Визуальное оформление
С помощью свойства renderOption
можно влиять на отображение конкретного элемента выпадающего списка.
Вы можете изменить стандартный компонент CustomSelectOption
или использовать свой компонент.
CustomSelectOption
Универсальный компонент для отрисовки одного из значений в выпадающем списке.
Передавайте данный компонент в свойство renderOption
, для кастомизации значений выпадающего списка.
Помимо CustomSelect
используется и в ChipsSelect
.
Для реализации многоуровневых CustomSelectOption
используйте свойство hierarchy
,
которое позволяет создать нужный отступ в зависимости от уровня вложенности.
Тестирование (e2e)
Для поиска компонента и его элементов на странице cуществует ряд вспомогательных свойств:
По умолчанию все data-*
атрибуты попадают на <input>
компонента, это значит, что при передаче
data-testid
или data-test-id
идентификатор попадёт <input>
.
Доступ к полю ввода может быть полезен для:
- получения текста, введённого пользователем при поиске опций, в режиме
searchable
; - получения информации о наличии фокуса на компоненте;
- симуляции работы с компонентом с клавиатуры.
Используйте labelTextTestId
:
- для симуляции работы с компонентом с помощью мыши, тач-устройства;
- для получения текста выбранной в данный момент опции.
Для взаимодействия с кнопкой очистки состояния компонента, которая появляется,
если CustomSelect
имеет свойство searchable
и пользователь выбрал опцию, используйте свойство clearButtonTestId
.
CustomSelect
внутри себя хранит невидимый <select>
, для того, чтобы CustomSelect
можно было использовать внутри формы.
Для получения доступа к <select>
используйте свойство nativeSelectTestId
. Полезно для доступа к значению value
,
выбранной в данный момент опции.
Все перечисленные выше свойства устанавливают аттрибут data-testid
у соответствующих элементов. Учитывайте это при построении селекторов.
Доступность (a11y)
Следуйте рекомендациям доступности компонента Select
.
Свойства и методы
CustomSelect
Свойство | Описание |
---|---|
after | ReactNode Добавляет иконку справа. Рекомендации:
По умолчанию: - |
afterAlign | FieldIconsAlign Вертикальное выравнивание иконки справа. По умолчанию: - |
align | AlignType По умолчанию: - |
allowClearButton | boolean Если По умолчанию: - |
before | ReactNode Добавляет иконку слева. Рекомендации:
По умолчанию: - |
beforeAlign | FieldIconsAlign Вертикальное выравнивание иконки слева. По умолчанию: - |
ClearButton | ComponentType<CustomSelectClearButtonProps> Кастомная кнопка для очистки значения.
Должна принимать обязательное свойство По умолчанию: - |
clearButtonTestId | string Передает атрибут По умолчанию: - |
defaultValue | SelectValue См. По умолчанию: - |
dropdownAutoWidth | boolean Ширина раскрывающегося списка зависит от контента. По умолчанию: - |
dropdownOffsetDistance | number Отступ от выпадающего списка. По умолчанию: - |
emptyText | string Текст, который будет отображен, если приходит пустой По умолчанию: - |
fetching | boolean Если По умолчанию: - |
filterFn | false | FilterFn<OptionInterfaceT> Функция для кастомной фильтрации. По умолчанию поиск производится по По умолчанию: - |
forceDropdownPortal | boolean Использовать Portal для рендеринга выпадающего списка. По умолчанию: - |
getRef | Ref<HTMLSelectElement> По умолчанию: - |
getRootRef | Ref<HTMLDivElement> По умолчанию: - |
getSelectInputRef | Ref<HTMLInputElement> Ref на внутрений компонент input. По умолчанию: - |
icon | ReactNode Иконка раскрывающегося списка. По умолчанию: - |
labelTextTestId | string Передает атрибут По умолчанию: - |
mode | "default" | "plain" Режим отображения.
По умолчанию: - |
multiline | boolean Флаг для включения многострочного режима. По умолчанию: - |
nativeSelectTestId | string Передает атрибут По умолчанию: - |
noMaxHeight | boolean Отключает максимальную высоту по умолчанию. По умолчанию: - |
onChange | ((e: ChangeEvent<HTMLSelectElement>, newValue: SelectValue) => void) Обработчик, срабатывающий при изменении выбранного значения. Вторым параметром прокидывается новое значение. По умолчанию: - |
onClose | VoidFunction Обработчик закрытия выпадающего списка. По умолчанию: - |
onInputChange | ((e: ChangeEvent<HTMLInputElement>) => void) Событие изменения текстового поля. По умолчанию: - |
onInputKeyDown | ((e: KeyboardEvent<Element>, isOpen: boolean) => void) Обработчик события По умолчанию: - |
onOpen | VoidFunction Обработчик открытия выпадающего списка. По умолчанию: - |
options | OptionInterfaceT[] Список опций в списке. По умолчанию: - |
overscrollBehavior | "auto" | "none" | "contain" Поведение overscroll, подробнее можно почитать в документации ↗. По умолчанию: - |
placeholder | string Текст-подсказка при отсутствии выбранного значения. По умолчанию: - |
popupDirection | PopupDirection Направление раскрытия выпадающего списка. По умолчанию: - |
renderDropdown | (({ defaultDropdownContent, }: { defaultDropdownContent: ReactNode; }) => ReactNode) Рендер-проп для кастомного рендера содержимого дропдауна.
В По умолчанию: - |
renderOption | ((props: CustomSelectRenderOption<OptionInterfaceT>) => ReactNode) Рендер-проп для кастомного рендера опции. В объекте аргумента приходят свойства опции ↗. По умолчанию: - |
searchable | boolean Если По умолчанию: - |
selectType | SelectType Тип отображения компонента. По умолчанию: - |
status | "default" | "error" | "valid" Статус отображения поля в форме. По умолчанию: - |
value | SelectValue Выбранное значение. По умолчанию: - |
CustomSelectOption
Свойство | Описание |
---|---|
after | ReactNode Вставляет элемент в конец блока после основного контента.
Например, можно передать компонент По умолчанию: - |
before | ReactNode Вставляет элемент в начало блока перед основным контентом.
Например, можно передать компонент По умолчанию: - |
description | ReactNode Добавляет описание под основным блоком. По умолчанию: - |
disabled | boolean Блокирует весь блок. По умолчанию: - |
focused | boolean Включает состояние фокуса. По умолчанию: - |
getRootRef | Ref<HTMLDivElement> По умолчанию: - |
hierarchy | number Позволяет создавать вложенность. По умолчанию: 0 |
hovered | boolean Включает состояние наведения. По умолчанию: - |
selected | boolean Включает состояние выбранного элемента списка. По умолчанию: - |