Tom Select предназначен для усиления стандартных HTML-элементов
<select>, и его поведение напрямую зависит от
структуры исходной разметки. Разные типы элементов требуют различных
подходов к инициализации, особенно в случаях одиночного выбора,
множественного выбора, групп опций и динамической загрузки данных.
<select>Базовый сценарий — преобразование обычного выпадающего списка с одиночным выбором. В этом случае не требуется дополнительных настроек.
<select id="country-select">
<option value="kz">Kazakhstan</option>
<option value="ru">Russia</option>
<option value="de">Germany</option>
</select>
new TomSelect("#country-select");
Поведение остаётся семантически эквивалентным стандартному
<select>, но добавляется поиск, кастомизация рендера
и улучшенный UI.
<select multiple>При использовании атрибута multiple компонент
автоматически переключается в режим работы с массивом значений.
<select id="tags-select" multiple>
<option value="js">JavaScript</option>
<option value="ts">TypeScript</option>
<option value="css">CSS</option>
</select>
new TomSelect("#tags-select");
Особенности:
Если у <select> уже установлены
selected-опции, Tom Select автоматически синхронизирует их
с внутренним состоянием.
<select id="lang-select">
<option value="en">English</option>
<option value="fr" selected>French</option>
<option value="es">Spanish</option>
</select>
new TomSelect("#lang-select");
Выбранное значение fr будет отражено сразу после
инициализации без дополнительной конфигурации.
<select> и динамическое заполнениеПри отсутствии <option> элементы могут быть
добавлены программно через конфигурацию options.
<select id="empty-select"></select>
new TomSelect("#empty-select", {
options: [
{ value: "1", text: "Item 1" },
{ value: "2", text: "Item 2" }
]
});
Такой подход часто используется при загрузке данных из API или при построении интерфейса без серверной разметки.
<optgroup>)Поддержка группировки позволяет структурировать большие списки.
<select id="group-select">
<optgroup label="Frontend">
<option value="react">React</option>
<option value="vue">Vue</option>
</optgroup>
<optgroup label="Backend">
<option value="node">Node.js</option>
<option value="go">Go</option>
</optgroup>
</select>
new TomSelect("#group-select");
Поведение:
<optgroup>.Tom Select может полностью обходиться без DOM-опций, используя только массив данных.
<select id="js-data"></select>
new TomSelect("#js-data", {
options: [
{ value: "kz", text: "Kazakhstan" },
{ value: "uz", text: "Uzbekistan" }
],
items: ["kz"]
});
Этот способ полезен при SPA-архитектурах, где UI формируется на основе состояния приложения.
В ряде случаев элемент инициализируется до получения данных.
<select id="async-select"></select>
const select = new TomSelect("#async-select", {
options: []
});
fetch("/api/items")
.then(res => res.json())
.then(data => {
data.forEach(item => {
select.addOption(item);
});
select.refreshOptions(false);
});
Ключевые моменты:
addOption добавляет элементы в рантайме;refreshOptions обновляет отображение списка.Отключённые элементы сохраняют состояние, но не участвуют в выборе.
<select id="disabled-select" disabled>
<option value="a">A</option>
<option value="b">B</option>
</select>
new TomSelect("#disabled-select");
Логика:
При использовании data-* атрибутов возможно расширение
модели данных.
<select id="data-select">
<option value="1" data-type="premium">Pro</option>
<option value="2" data-type="free">Basic</option>
</select>
new TomSelect("#data-select", {
render: {
option: function(data, escape) {
return `<div>${escape(data.text)} (${data.type})</div>`;
}
}
});
Такой подход используется при необходимости визуально различать
элементы без изменения значения value.
При повторном вызове инициализации необходимо учитывать уже созданный экземпляр.
const el = document.querySelector("#country-select");
if (!el.tomselect) {
new TomSelect(el);
}
Особенность:
tomselect;