PassFront
  1. PassFront
  2. База знаний
  3. Компоненты

Зачем использовать Slot в Select компоненте React?

Компоненты

Slot-паттерн в компоненте Select нужен, чтобы сделать его гибким к содержимому: потребитель сам решает, что рендерить в частях компонента (триггер, опция, пустое состояние), не переписывая логику выбора.

Проблема без слотов

Select с фиксированной разметкой обрастает пропами под каждый случай: optionIcon, optionDescription, renderBadge, emptyText... API распухает, а нестандартный вариант всё равно не собрать.

Слоты через children/composition

<Select value={value} onChange={setValue}>
  <Select.Trigger>
    <Avatar user={selected} /> {selected?.name ?? 'Выберите...'}
  </Select.Trigger>

  <Select.Content>
    {users.map((u) => (
      <Select.Option key={u.id} value={u.id}>
        <Avatar user={u} />
        <span>{u.name}</span>
        <Badge status={u.status} />   {/* произвольное содержимое опции */}
      </Select.Option>
    ))}
  </Select.Content>
</Select>

Логика (открытие, клавиатура, выбор, доступность) живёт в Select и раздаётся частям через внутренний контекст; внешний вид каждой части — за потребителем. Так устроены Radix UI, Headless UI, shadcn/ui.

Отдельный смысл: asChild/Slot (Radix)

В Radix «Slot» — ещё и утилита для слияния поведения с чужим элементом: <Select.Trigger asChild><MyButton /></Select.Trigger> не создаёт лишнюю обёртку, а передаёт обработчики и aria-атрибуты прямо вашей кнопке — сохраняется и поведение, и ваша разметка.

Что даёт подход

  • Кастомизация без роста API: иконки, статусы, любая вёрстка опций.
  • Переиспользование логики: один «headless»-Select — множество визуальных вариантов.
  • Чистая доступность в одном месте (клавиатура, aria).

Коротко для собеседования

Слоты в Select отделяют логику выбора от разметки: потребитель наполняет части (Trigger/Option/Content) любым содержимым, а логика и доступность остаются в компоненте (compound components + контекст). Radix-вариант Slot/asChild дополнительно «вживляет» поведение в ваш собственный элемент без обёртки.

Другие вопросы раздела