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
- Button
- Predefined
- Render value
- Render item
- Render icon
- Portal
- Uncontrolled
- Virtual
- Infinite Loading
- Выбрать всё
- Tree View
В режиме textfield-like target внешне мимикрирует под компонент TextField и наследует все его свойства.
В режиме button-like target внешне мимикрирует под компонент Button. Свойства из TextField, например contentLeft, contentRight, helperText, labelPlacement, keepPlaceholder, chipType и chipClickArea и тд., в этом режиме не применяются.
Есть возможность задать значения по дефолту (главное, чтобы они находились в items). Также можно управлять состоянием снаружи.
Пропс renderValue переопределяет текст выбранного значения внутри target. Коллбэк получает один аргумент: выбранный item.
Пропс renderItem отвечает за кастомный рендер элемента списка и получает весь объект item.
В примере использован другой наш компонент - Cell.
renderSelectionIcon кастомизирует иконку выбранного состояния элемента. Коллбэк получает true, false или 'indeterminate'.
Иногда возникает необходимость вынесения выпадающего списка на уровни выше в DOM. К примеру, когда у родительского блока имеется скролл, и список будет обрезаться, чего в большинстве случаев хотелось бы избежать.
Для такой реализации имеется пропс portal, который принимает либо ref либо id html-тега.
Также нужно прокинуть проп listWidth, чтобы явно задать ширину списку. Если этого не сделать, то будет взята ширина 100% от блока, на который ведет ссылка портала.
value и onChange опциональны. Если нужен uncontrolled-вариант без интеграции с формой, достаточно передать items.
Свойство virtual позволяет виртуализировать выпадающий список. Для настройки высоты списка можно использовать свойство listMaxHeight.
Работает только в одноуровневых списках.
Пример с бесконечной загрузкой элементов в списке.
Работа с кнопкой "Выбрать всё" осуществляется через свойство selectAllOptions только в режиме multiselect:
type SelectAllProps = {
checked?: boolean;
indeterminate?: boolean;
label?: string;
onClick?: () => void;
sticky?: boolean;
};
Вся логика выбора элементов и взаимодействия с компонентом лежит на стороне пользователя.
Включение отображения выпадающего списка в виде дерева осуществляется через свойство treeView. Для настройки стороны стрелочки открытия/закрытия используется свойство arrowPlacement.
Взаимодействие с disabled-элементами
Изнутри компонента взаимодействие с disabled-элементами невозможно. Ниже представлены примеры с selected и unselected disabled-элементом.
Использование с React Hook Form и нативной формой
nameИспользуйте свойство name только когда это необходимо. Если value не передан, компонент работает в native-режиме и onChange получает native-like event.
- Default
- Controller
- Native Form
Работа с react-hook-form через register.
Работа с react-hook-form через controller.
Работа с нативной формой.
Поиск совпадений с функцией подсветки символов
Combobox - уже имеет механизм поиска и фильтрацию из коробки.
Данный пример показывает реализацию подсветки (highlighting) символов в найденных элементах в режиме treeView.
Клавиатурная навигация
Данный компонент соответствует требования W3C: Select и частично TreeView.
Tab- закрывает дропдаун. Перемещает фокус на следующий элемент на странице;Enter- открывает/закрывает дропдаун. Если на элементе - выбирает его. Если у элемента есть дочерний дропдаун - открывает его, выбор элемента не происходит;Space- открывает/закрывает дропдаун. Если на элементе - выбирает его и все дочерние элементы.Home- открывает дропдаун и перемещает фокус на первый элемент;End- открывает дропдаун и перемещает фокус на последний элемент;PageUp- перемещает фокус на 10 элементов выше либо в начало списка;PageDown- перемещает фокус на 10 элементов ниже либо в конце списка;ArrowUp- открывает дропдаун и перемещает фокус на первый элемент. Перемещает фокус на один элемент выше;ArrowDown- открывает дропдаун и перемещает фокус на первый элемент. Перемещает фокус на один элемент ниже;ArrowRight- если фокус на элементе вложенного списка - открывает его и перемещает фокус на первый элемент; Если фокус на таргете - переходит в режим выбора чипа.ArrowLeft- закрывает текущий список и перемещает фокус на предыдущий; Если фокус на таргете - переходит в режим выбора чипа.Backspace- только если фокус на чипе - снимает выбор с текущего значения;