ChipChoice.Multiple
Чип с выпадающим списком опций и множественным выбором. Значение — массив выбранных опций; список открывается кликом и рендерится через портал.
Когда использовать
- Для фильтрации по нескольким значениям сразу: категории, теги, статусы.
- Когда выбор должен выглядеть как компактный чип в ряду фильтров.
- Когда списку нужен поиск по опциям — через проп
searchable.
Когда не нужен ChipChoice.Multiple:
- Нужно выбрать ровно одно значение:
- используйте
ChipChoice.Single.
- используйте
- Нужно inline-действие без выбора:
- используйте
ChipAssist.
- используйте
- Нужна классическая кнопка действия:
- используйте
Button.
- используйте
Анатомия
Value display
value и defaultValue — массивы значений (string | number)[]. В лейбле чипа отображается сводка по выбранным опциям; при множественном выборе показывается счётчик или перечисление через valueRender.
Size (default s)
s— для плотных тулбаров и строк фильтров.m— стандартный размер.l— для крупных форм.
Apply mode
Режим применения выбора управляется пропом autoApply.
autoApply(defaulttrue) — каждое изменение выбора применяется сразу.autoApply={false}— внизу списка появляется футер с кнопками Apply/Cancel; подтверждение — черезonApprove, отмена — черезonCancel.
Searchable
searchable— добавляет поле поиска в выпадающий список, опции фильтруются по введённому тексту.
Уместно для списков от 6–7 опций, где скролл становится неудобным.
Состояния
disabled— отключает взаимодействие.loading— показывает спиннер и блокирует открытие списка.
Установка
pnpm add @cloud-ru/ds-chips
import { ChipChoice } from '@cloud-ru/ds-chips'
Примеры использования
Множественный выбор
tsx
import { ChipChoice } from '@cloud-ru/ds-chips';
import { useState } from 'react';
const OPTIONS = [
{ value: 'news', label: 'Новости' },
{ value: 'guides', label: 'Гайды' },
{ value: 'releases', label: 'Релизы' },
{ value: 'events', label: 'События' },
];
export function ChoiceMultipleBasic() {
const [value, setValue] = useState<(string | number)[]>(['news', 'releases']);
return (
<ChipChoice.Multiple label='Category' options={OPTIONS} value={value} onChange={next => setValue(next ?? [])} />
);
}С поиском
tsx
import { ChipChoice } from '@cloud-ru/ds-chips';
import { useState } from 'react';
const OPTIONS = [
{ value: 'react', label: 'React' },
{ value: 'vue', label: 'Vue' },
{ value: 'svelte', label: 'Svelte' },
{ value: 'angular', label: 'Angular' },
{ value: 'solid', label: 'Solid' },
{ value: 'qwik', label: 'Qwik' },
];
export function ChoiceMultipleSearchable() {
const [value, setValue] = useState<(string | number)[]>(['react', 'svelte']);
return (
<ChipChoice.Multiple
searchable
label='Tags'
options={OPTIONS}
value={value}
onChange={next => setValue(next ?? [])}
/>
);
}Props
Types
Props
ChipChoiceMultipleProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
autoApply | boolean | true | no | Флаг, отвечающий за применение выбранного значения по умолчанию |
className | string | — | no | CSS-класс |
contentRender | ((option: { label: ItemId; value?: ItemId; contentRenderProps?: T; }) => ReactNode) | undefined | — | no | Кастомный рендер контента опции |
data-test-id | string | — | no | |
dataError | boolean | — | no | Загрузка данных завершилась ошибкой: показывается `errorDataState` |
dataFiltered | boolean | — | no | Текущий пустой список — результат поиска/фильтра: показывается `noResultsState` вместо `noDataState` |
defaultValue | ItemId[] | — | no | Начальное состояние |
disableFuzzySearch | boolean | false | no | Отключает Fuzzy Search |
disabled | boolean | — | no | Отключён |
dropDownClassName | string | — | no | |
errorDataState | EmptyStateProps | — | no | Экран при ошибке запроса |
filterFn | ((option: { label: ItemId; value?: ItemId; contentRenderProps?: T; }) => boolean) | undefined | — | no | Функция фильтрации опций |
footer | ReactNode ; | — | no | Кастомизируемый элемент в конце списка |
footerActiveElementsRefs | RefObject<HTMLElement>[] | — | no | Список ссылок на кастомные элементы, помещенные в специальную секцию внизу списка |
icon | ReactNode | — | no | Иконка |
label | string | — | no | Текст чипа |
loading | boolean | — | no | Состояние загрузки Флаг, отвечающий за состояние загрузки списка |
noDataState | EmptyStateProps | — | no | Экран при отсутствии данных |
noResultsState | EmptyStateProps | — | no | Экран при отсутствии результатов поиска или фильтров |
onApprove | (() => void) | — | no | Колбек основной кнопки |
onCancel | (() => void) | — | no | Колбек кнопки отмены |
onChange | OnChangeHandler<ItemId[]> | — | no | Controlled обработчик изменения состояния — получает массив выбранных `ItemId[]` |
onClearButtonClick | MouseEventHandler<HTMLButtonElement> | — | no | Колбек для клика по кнопке очистки |
onClick | MouseEventHandler<HTMLButtonElement | HTMLDivElement> | — | no | Колбек обработки клика |
onOpenChange | ((isOpen: boolean) => void) | — | no | Колбек отображения компонента |
open | boolean | — | no | Управляет состоянием показан/не показан |
options | FilterOption<T>[] | — | yes | Массив опций |
placement | "bottom" | "bottom-end" | "bottom-start" | "left" | "left-end" | "left-start" | "right" | "right-end" | "right-start" | "top" | "top-end" | "top-start" | — | no | Расположение выпадающего меню |
scrollContainerRef | Ref<HTMLElement> | — | no | Ссылка на контейнер, который скроллится |
scrollRef | Ref<HTMLElement> | — | no | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
scrollToSelectedItem | boolean | — | no | Флаг, отвечающий за прокручивание до выбранного элемента |
searchable | boolean | — | no | Показывать строку поиска в дроплисте |
selection | SelectionMultipleState | SelectionSingleState | — | no | Настройки выбора элементов. `mode: 'single'` — один выбранный элемент (`value: ItemId`), `mode: 'multiple'` — множественный выбор (`value: ItemId[]`). Без `selection` выбора нет — клик вызывает только `onClick` элемента. |
size | "l" | "m" | "s" | m | no | Размер |
tabIndex | number | — | no | Индекс в порядке фокусировки |
truncateVariant | "end" | "middle" | 'middle' | no | Вариант обрезания строки Вариант обрезания значения |
value | ItemId[] | — | no | Controlled состояние |
valueRender | ((option?: BaseOption<T>[]) => ReactNode) | — | no | Колбек формирующий отображение выбранного значения |
virtualized | boolean | — | no | Включить виртуализацию элементов списка. Рекомендуется при количестве элементов от 1000. |
widthStrategy | "auto" | "eq" | "gte" | gte | no | Стратегия упра вления шириной контейнера поповера |
Storybook
Figma
Смотри также
- ChipChoice.Single — чип-селектор с одиночным выбором.
- Chips — обзор семейства чипов.