Компонент Combobox представляет собой расширенный
элемент выбора из списка, совмещающий возможности обычного
<select> и текстового поля для поиска. Он
обеспечивает интерактивность, улучшает UX при работе с большим
количеством опций и позволяет интегрировать автозаполнение и фильтрацию
данных.
Базовый Combobox включает следующие ключевые элементы:
Простейшая структура в SvelteKit может выглядеть так:
<script>
import { Combobox } from 'sveltekit-ui';
let selectedItem = null;
const items = ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry'];
</script>
<Combobox bind:value={selectedItem} items={items} placeholder="Выберите фрукт" />
Компонент Combobox поддерживает следующие важные свойства:
items – массив значений, доступных для выбора.value / bind:value – выбранное значение,
двусторонняя привязка.placeholder – текст подсказки внутри поля.disabled – блокировка ввода и открытия списка.filter – функция фильтрации, используемая для поиска по
списку.multiple – позволяет выбирать несколько элементов.clearable – возможность очистки выбранного
значения.Пример с кастомной фильтрацией:
<Combobox
bind:value={selectedItem}
{items}
placeholder="Начните вводить название фрукта"
filter={(input, item) => item.toLowerCase().includes(input.toLowerCase())}
/>
Combobox поддерживает стандартные события Svelte, такие как:
on:change – срабатывает при изменении выбранного
значения.on:input – срабатывает при вводе текста.on:focus / on:blur – события фокусировки
для управления стилями или логикой валидации.Пример использования события change:
<Combobox
bind:value={selectedItem}
items={items}
on:change={(e) => console.log('Выбран:', e.detail)}
/>
Для сценариев, когда нужно выбрать несколько опций одновременно,
используется свойство multiple. Это превращает Combobox в
компонент, напоминающий теговый ввод с возможностью удаления отдельных
элементов.
<Combobox
bind:value={selectedItems}
items={items}
multiple
placeholder="Выберите фрукты"
/>
В selectedItems хранится массив выбранных значений,
который можно динамически обновлять и использовать в логике
приложения.
SvelteKit UI позволяет тонко настраивать внешний вид Combobox через:
class
или специальные свойства class:item,
class:dropdown.Пример кастомного слота для опции:
<Combobox bind:value={selectedItem} items={items}>
<svelte:fragment slot="item" let:item>
<div class="option">
<strong>{item}</strong> - дополнительная информация
</div>
</svelte:fragment>
</Combobox>
Combobox легко работает с асинхронными источниками данных, например,
при поиске на сервере. Для этого используется реактивная переменная с
массивом элементов и await внутри функции фильтрации.
<script>
import { Combobox } from 'sveltekit-ui';
let items = [];
let query = '';
$: if (query.length > 1) {
fetch(`/api/fruits?search=${query}`)
.then(res => res.json())
.then(data => items = data);
}
</script>
<Combobox
bind:value={selectedItem}
{items}
placeholder="Поиск фрукта"
on:input={(e) => query = e.detail}
/>
Combobox автоматически поддерживает:
role="combobox",
aria-expanded, aria-selected).Для сложных случаев можно дополнительно использовать слоты для
label и description, чтобы улучшить
доступность.
filter для локальной фильтрации, чтобы
снизить нагрузку на сервер.Пример комбинирования кастомного рендера и нового тега:
<Combobox
bind:value={selectedItem}
items={items}
allow-new
>
<svelte:fragment slot="item" let:item>
<div style="display:flex; align-items:center;">
<img src={`/images/${item}.png`} alt="" width="20" height="20"/>
<span>{item}</span>
</div>
</svelte:fragment>
</Combobox>
Этот подход позволяет создавать высокоинтерактивные и визуально насыщенные интерфейсы, полностью используя возможности SvelteKit UI.