Select

Использование

Обязательным параметром является только items. Для controlled-варианта передавайте value и onChange, для интеграции с формой используйте name и при необходимости defaultValue.

Множественный выбор включается через multiselect. В single-режиме value имеет тип string, в multiselect-режиме string[].

В single-режиме можно использовать mode="radio", если нужно запретить снятие выбора повторным кликом. В multiselect-режиме доступны selectAllOptions и isTargetAmount.

Select поддерживает два вида target-элемента: textfield-like по умолчанию и button-like. Для кастомизации доступны:

  • renderValue для текста выбранного значения;
  • renderTarget для полного переопределения target;
  • renderItem и renderSelectionIcon для отображения элементов списка;
  • beforeList, afterList и emptyStateDescription для содержимого выпадающего списка.

Внутри items можно передавать вложенные элементы. Базовый формат:

type Items = Array<{
/**
* Значение item.
*/
value: string;
/**
* Метка-подпись к item.
*/
label: string;
/**
* Сторона открытия вложенного списка относительно текущего элемента.
* @default right
*/
placement?: SelectPlacement | Array<SelectPlacementBasic>;
/**
* Список дочерних items.
*/
items?: Array<ItemOption>;
/**
* Item не активен.
*/
disabled?: boolean;
/**
* Слот для контента слева.
*/
contentLeft?: ReactNode;
/**
* Слот для контента справа.
*/
contentRight?: ReactNode;
/**
* Classname для item.
*/
className?: string;
/**
* Максимальная высота дочернего выпадающего списка.
*/
listMaxHeight?: CSSProperties['height'];
}>;

Примеры

В режиме textfield-like target внешне мимикрирует под компонент TextField и наследует все его свойства.

Live Editor

Result

Взаимодействие с disabled-элементами

Изнутри компонента взаимодействие с disabled-элементами невозможно. Ниже представлены примеры с selected и unselected disabled-элементом.

Live Editor

Result

Использование с React Hook Form и нативной формой

Использование атрибута name

Используйте свойство name только когда это необходимо. Если value не передан, компонент работает в native-режиме и onChange получает native-like event.

Работа с react-hook-form через register.

Live Editor

Result

Поиск совпадений с функцией подсветки символов

tip

Combobox - уже имеет механизм поиска и фильтрацию из коробки.

Данный пример показывает реализацию подсветки (highlighting) символов в найденных элементах в режиме treeView.

Live Editor

Result

Клавиатурная навигация

Данный компонент соответствует требования W3C: Select и частично TreeView.

  • Tab - закрывает дропдаун. Перемещает фокус на следующий элемент на странице;
  • Enter - открывает/закрывает дропдаун. Если на элементе - выбирает его. Если у элемента есть дочерний дропдаун - открывает его, выбор элемента не происходит;
  • Space - открывает/закрывает дропдаун. Если на элементе - выбирает его и все дочерние элементы.
  • Home - открывает дропдаун и перемещает фокус на первый элемент;
  • End - открывает дропдаун и перемещает фокус на последний элемент;
  • PageUp - перемещает фокус на 10 элементов выше либо в начало списка;
  • PageDown - перемещает фокус на 10 элементов ниже либо в конце списка;
  • ArrowUp - открывает дропдаун и перемещает фокус на первый элемент. Перемещает фокус на один элемент выше;
  • ArrowDown - открывает дропдаун и перемещает фокус на первый элемент. Перемещает фокус на один элемент ниже;
  • ArrowRight - если фокус на элементе вложенного списка - открывает его и перемещает фокус на первый элемент; Если фокус на таргете - переходит в режим выбора чипа.
  • ArrowLeft - закрывает текущий список и перемещает фокус на предыдущий; Если фокус на таргете - переходит в режим выбора чипа.
  • Backspace - только если фокус на чипе - снимает выбор с текущего значения;