Skip to content

SSelect

Выпадающий список с вариантами выбора.

В чем отличие от аналогов?

В отличие от популярных библиотек компонентов для Vue3:

  1. Исключает опции, которые, как правило, не используются в стартапах (флоат лейблы, размеры), но из-за которых разные программисты реализовывают компонент по-разному. Без лишних опций унифицируется код и внешний вид компонентов, упрощается поддержка и взаимозаменяемость.
  2. Поддерживает два формата передачи опций, удобных для выгрузки из контроллеров Laravel:
    1. {value1: title1, value2: title2} — что удобно для быстрого получения из key-value конфигов, а также из моделей — User::pluck('name', 'id');
    2. [[value1, title1], [value2, title2]] — что удобно для выгрузки там, где важен порядок. Это минимизирует код в контроллерах, помогая сохранять принцип «тонкого контроллера», которого мы придерживаемся.
  3. Взаимозаменяемость формата опций с другими выбиралками из вариантов. Это позволяет легко заменять SSelect на SCheckboxGroup или SRadioGroup, не трогая бэкенд код.

Классический вариант

Выберите
<SSelect v-model="value" :options="options" placeholder="Выберите" />

Где options — это объект вариантов выбора в формате {value1: title1, value2: title2} или массив в формате [[value1, title1], [value2, title2]]

Фильтрация при вводе

<SSelect v-model="value" :options="options" filterable placeholder="Выберите" />

Получение значений по API

Список значений можно подгружать по API — в том числе на каждый ввод. Ниже живой пример: варианты приходят с публичного тестового API DummyJSON, запрос уходит в обработчике события @filter. Начните вводить имя (например, «jo»):

<SSelect v-model="value" :options="options" filterable @filter="onFilter" placeholder="Начните вводить имя" />

Обработчик @filter получает введённую строку; ответ API мы приводим к формату опций ([[value, title]] или {value: title}) и кладём в :options. В реальном проекте запрос обычно стоит дебаунсить.

Возможность сброса значения

Иногда бывает нужно сделать возможность сбрасывать значение в невыбранное (null). Для этого используется атрибут clearable:

Не выбрано
<SSelect v-model="user" :options="options" clearable placeholder="Не выбрано" />

Виртуальный скролл

Когда доступно очень много вариантов выбора, можно применить виртуальный скролл для более быстрой загрузки, добавив атрибут virtual:

Выберите регион
<SSelect v-model="region" :options="regions" virtual placeholder="Выберите регион" />

Интерфейс компонента

Свойства (Props)

НазваниеТипПо умолчаниюОписание
v-modelany-Текущее выбранное значение.
optionsRecord | Array-Список вариантов (объект или массив пар).
placeholderstring-Текст заглушки.
filterablebooleanfalseВключает текстовый поиск.
clearablebooleanfalseПоказывает кнопку сброса значения.
disabledbooleanfalseОтключает компонент.
inlinebooleanfalseУбирает границы и делает селект компактным.
virtualbooleanfalseВключает виртуальный скролл.
virtualScrollSizenumber10Количество одновременно отображаемых элементов при виртуальном скролле.

Слоты (Slots)

НазваниеПараметрыОписание
value{ value: any }Кастомное отображение выбранного значения.
option{ option: { label: string, value: any } }Кастомное отображение элемента в выпадающем списке.

События (Events)

НазваниеПараметрыОписание
change(value: any)Вызывается при изменении значения.
filter(query: string)Вызывается при вводе текста в режиме поиска.