Select
Адаптивный компонент для выбора одного значения из списка опций. Автоматически переключается между компонентом
NativeSelect (для мобильных устройств) и CustomSelect (в остальных случаях).
Связанные компоненты:
Режим работы
Компонент поддерживает работу как в неконтролируемом режиме, так и контролируемом. Это стандартное поведение React-компонентов, прочитать про это можно в документации React ↗.
Для использования неконтролируемого режима достаточно просто не передавать value или передавать defaultValue, если
требуется задать значение по умолчанию.
Для контролируемого режима используйте связку свойств value/onChange для задания значения и его изменения.
const colors = [
{
value: 'red',
label: 'Красный',
},
{
value: 'green',
label: 'Зелёный',
},
{
value: 'blue',
label: 'Синий',
},
];
// Неконтролируемое состояние
<Select options={colors} defaultValue="red" />;
// Контролируемое состояние
const [color, setColor] = React.useState('red');
<Select options={colors} value={color} onChange={(_, newColor) => setColor(newColor)} />;Состояния
disabled
Свойство disabled блокирует взаимодействие с компонентом и добавляет визуальную индикацию недоступности.
Валидация
Свойство status используется для визуализации валидации компонента - некорректности заполненного поля (значение "error")
или успешной валидации (значение "valid").
Тестирование (e2e)
Если Select отрисовывает NativeSelect, то достаточно передать testId через data-* аттрибут для поиска элемента на странице.
Если Select отрисовывает CustomSelect, то следуйте рекомендациям из раздела “Тестирование (e2e)” компонента CustomSelect.
<View activePanel="select">
<Panel id="select">
<PanelHeader>Select</PanelHeader>
<Group>
<FormItem
top="Администратор"
htmlFor="select-id"
bottom="Пример использования Select для выбора администратора из списка"
>
<Select
id="select-id"
placeholder="Не выбран"
options={getRandomUsers(10).map((user) => ({
label: user.name,
value: user.id,
avatar: user.photo_100,
}))}
renderOption={({ option, ...restProps }) => (
<CustomSelectOption
{...restProps}
key={option.value}
before={<Avatar size={24} src={option.avatar} />}
/>
)}
/>
</FormItem>
</Group>
</Panel>
</View>Доступность (a11y)
Старайтесь сопровождать элемент текстовым описанием, для корректной работы скринридеров. Для этого необходимо вручную передавать некоторые параметры:
- При задании текстового описания с помощью элемента
labelпередавайтеidкомпонента в свойствоhtmlForэлементаlabel. Это позволит фокусироваться на компоненте кликом по заголовку и автоматически добавит имя компоненту для скринридеров. - Если по какой-то причине текстовое описание компонента не получается обернуть в тэг
label, то можно попробовать связать текстовое описание с компонентом через aria-labelledby ↗. Для этого передайтеidтекстового элемента компоненту в свойство aria-labelledby ↗. - При отсутствии по дизайну у выпадающего списка текстового описания старайтесь всё же его добавлять,
но прятать с помощью элемента
VisuallyHidden, чтобы оно оставалось доступно для пользователей ассистивных технологий. В крайнем случае используйте aria-label ↗ аттрибут. - При использовании вместе с
FormItemследуйте рекомендациям раздела “Цифровая доступность” компонентаFormItem.
Старайтесь сопровождать элемент свойством placeholder.
Пример рекомендуемого использования компонента Select с текстовым описанием:
- вместе с
label
<label htmlFor="select-id">Цвет</label>
<Select
id="select-id"
placeholder="Не выбран"
options={[ id: 'red', name: 'Красный' ]}
/>- вместе с
FormItem
<FormItem top="Цвет" htmlFor="select-id">
<Select id="select-id" placeholder="Не выбран" options={[ id: 'red', name: 'Красный' ]} />
</FormItem>- вместе с
VisuallyHidden(используяlabelиhtmlFor)
<VisuallyHidden Component="label" htmlFor="select-id">Цвет</VisuallyHidden>
<Select
id="select-id"
placeholder="Не выбран"
options={[ id: 'red', name: 'Красный' ]}
/>- вместе с aria-labelledby ↗
<span id="select-label-id">Цвет</span>
<Select
aria-labelledby="select-label-id"
placeholder="Не выбран"
options={[ id: 'red', name: 'Красный' ]}
/>- вместе с
VisuallyHidden(используя aria-labelledby ↗)
<VisuallyHidden Component="span" id="select-label-id">Цвет</VisuallyHidden>
<Select
aria-labelledby="select-label-id"
placeholder="Не выбран"
options={[ id: 'red', name: 'Красный' ]}
/>- вместе с aria-label ↗
<Select aria-label="Цвет" placeholder="Не выбран" options={[ id: 'red', name: 'Красный' ]} />Свойства и методы
| Свойство | Описание |
|---|---|
accessible | booleanВключает режим в котором выбранное значение По умолчанию: - |
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Если По умолчанию: - |
fetchingCompletedLabel | string | ((optionsCount: number) => string)Текстовая метка для индикации завершения процесса загрузки данных для пользователей скринридерами. По умолчанию: По умолчанию: - |
fetchingInProgressLabel | stringТекстовая метка для индикации процесса загрузки данных для пользователей скринридерами. По умолчанию: По умолчанию: - |
filterFn | false | FilterFn<OptionT>Функция для кастомной фильтрации. По умолчанию поиск производится по По умолчанию: - |
forceDropdownPortal | booleanИспользовать Portal для рендеринга выпадающего списка. По умолчанию: - |
getRef | Ref<HTMLSelectElement>Deprecated: Since 7.9.0. Вместо этого используйте По умолчанию: - |
getRootRef | Ref<HTMLDivElement>По умолчанию: - |
getSelectInputRef | Ref<HTMLInputElement>Deprecated: Since 7.9.0. Вместо этого используйте Ref на внутрений компонент input. По умолчанию: - |
icon | ReactNodeИконка раскрывающегося списка. По умолчанию: - |
labelTextTestId | stringПередает атрибут По умолчанию: - |
mode | "default" | "plain"Режим отображения.
По умолчанию: - |
multiline | booleanФлаг для включения многострочного режима. По умолчанию: - |
nativeSelectTestId | stringDeprecated: Since 7.9.0. Вместо этого используйте Передает атрибут По умолчанию: - |
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 | OptionT[]Список опций в списке. По умолчанию: - |
overscrollBehavior | "auto" | "none" | "contain"Поведение overscroll, подробнее можно почитать в документации ↗. По умолчанию: - |
placeholder | stringТекст-подсказка при отсутствии выбранного значения. По умолчанию: - |
popupDirection | PopupDirectionНаправление раскрытия выпадающего списка. По умолчанию: - |
renderDropdown | (({ defaultDropdownContent, }: { defaultDropdownContent: ReactNode; }) => ReactNode)Рендер-проп для кастомного рендера содержимого дропдауна.
В По умолчанию: - |
renderOption | ((props: CustomSelectRenderOption<OptionT>) => ReactNode)Рендер-проп для кастомного рендера опции. В объекте аргумента приходят свойства опции ↗. По умолчанию: - |
searchable | booleanЕсли По умолчанию: - |
selectType | SelectTypeТип отображения компонента. По умолчанию: - |
slotProps | ({ root?: (Omit<HTMLAttributes<HTMLDivElement>, "children"> & HasDataAttribute & HasRootRef<HTMLDivElement>); select?: (NativeHTMLSelectProps & ... 1 more ... & HasDataAttribute) | undefined; } & { ...; }) | undefinedСвойства, которые можно прокинуть внутрь компонента:
По умолчанию: - |
status | "default" | "error" | "valid"Статус отображения поля в форме. По умолчанию: - |
value | SelectValueВыбранное значение. По умолчанию: - |