ChipChoice.Multiple

Чип с выпадающим списком опций и множественным выбором. Значение — массив выбранных опций; список открывается кликом и рендерится через портал.

Когда использовать

  • Для фильтрации по нескольким значениям сразу: категории, теги, статусы.
  • Когда выбор должен выглядеть как компактный чип в ряду фильтров.
  • Когда списку нужен поиск по опциям — через проп searchable.

Когда не нужен ChipChoice.Multiple:

  • Нужно выбрать ровно одно значение:
  • Нужно inline-действие без выбора:
  • Нужна классическая кнопка действия:
    • используйте Button.

Анатомия

Value display

value и defaultValue — массивы значений (string | number)[]. В лейбле чипа отображается сводка по выбранным опциям; при множественном выборе показывается счётчик или перечисление через valueRender.

Size (default s)

  • s — для плотных тулбаров и строк фильтров.
  • m — стандартный размер.
  • l — для крупных форм.

Apply mode

Режим применения выбора управляется пропом autoApply.

  • autoApply (default true) — каждое изменение выбора применяется сразу.
  • 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'

Примеры использования

Множественный выбор

Множественный выборКонтролируемый массив значений через useState
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 ?? [])} />
  );
}

С поиском

С поискомsearchable добавляет поле поиска по опциям
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

PropsChipChoiceMultipleProps
PropTypeDefaultRequiredDescription
autoApplybooleantruenoФлаг, отвечающий за применение выбранного значения по умолчанию
classNamestringnoCSS-класс
contentRender((option: { label: ItemId; value?: ItemId; contentRenderProps?: T; }) => ReactNode) | undefinednoКастомный рендер контента опции
data-test-idstringno
dataErrorbooleannoЗагрузка данных завершилась ошибкой: показывается `errorDataState`
dataFilteredbooleannoТекущий пустой список — результат поиска/фильтра: показывается `noResultsState` вместо `noDataState`
defaultValueItemId[]noНачальное состояние
disableFuzzySearchbooleanfalsenoОтключает Fuzzy Search
disabledbooleannoОтключён
dropDownClassNamestringno
errorDataStateEmptyStatePropsnoЭкран при ошибке запроса
filterFn((option: { label: ItemId; value?: ItemId; contentRenderProps?: T; }) => boolean) | undefinednoФункция фильтрации опций
footerReactNode ;noКастомизируемый элемент в конце списка
footerActiveElementsRefsRefObject<HTMLElement>[]noСписок ссылок на кастомные элементы, помещенные в специальную секцию внизу списка
iconReactNodenoИконка
labelstringnoТекст чипа
loadingbooleannoСостояние загрузки Флаг, отвечающий за состояние загрузки списка
noDataStateEmptyStatePropsnoЭкран при отсутствии данных
noResultsStateEmptyStatePropsnoЭкран при отсутствии результатов поиска или фильтров
onApprove(() => void)noКолбек основной кнопки
onCancel(() => void)noКолбек кнопки отмены
onChangeOnChangeHandler<ItemId[]>noControlled обработчик изменения состояния — получает массив выбранных `ItemId[]`
onClearButtonClickMouseEventHandler<HTMLButtonElement>noКолбек для клика по кнопке очистки
onClickMouseEventHandler<HTMLButtonElement | HTMLDivElement>noКолбек обработки клика
onOpenChange((isOpen: boolean) => void)noКолбек отображения компонента
openbooleannoУправляет состоянием показан/не показан
optionsFilterOption<T>[]yesМассив опций
placement"bottom" | "bottom-end" | "bottom-start" | "left" | "left-end" | "left-start" | "right" | "right-end" | "right-start" | "top" | "top-end" | "top-start"noРасположение выпадающего меню
scrollContainerRefRef<HTMLElement>noСсылка на контейнер, который скроллится
scrollRefRef<HTMLElement>noСсылка на элемент, обозначающий самый конец прокручиваемого списка
scrollToSelectedItembooleannoФлаг, отвечающий за прокручивание до выбранного элемента
searchablebooleannoПоказывать строку поиска в дроплисте
selectionSelectionMultipleState | SelectionSingleStatenoНастройки выбора элементов. `mode: 'single'` — один выбранный элемент (`value: ItemId`), `mode: 'multiple'` — множественный выбор (`value: ItemId[]`). Без `selection` выбора нет — клик вызывает только `onClick` элемента.
size"l" | "m" | "s"mnoРазмер
tabIndexnumbernoИндекс в порядке фокусировки
truncateVariant"end" | "middle"'middle'noВариант обрезания строки Вариант обрезания значения
valueItemId[]noControlled состояние
valueRender((option?: BaseOption<T>[]) => ReactNode)noКолбек формирующий отображение выбранного значения
virtualizedbooleannoВключить виртуализацию элементов списка. Рекомендуется при количестве элементов от 1000.
widthStrategy"auto" | "eq" | "gte"gtenoСтратегия управления шириной контейнера поповера

Storybook

Figma

Смотри также

  • ChipChoice.Single — чип-селектор с одиночным выбором.
  • Chips — обзор семейства чипов.