Работа с предопределёнными наборами данных в Tom Select строится вокруг передачи массива объектов при инициализации компонента. В отличие от режимов с удалённым источником данных, статическая загрузка предполагает, что весь набор элементов уже доступен в памяти браузера и не требует дополнительных запросов к серверу. Такой подход обеспечивает максимальную скорость отклика интерфейса и предсказуемость поведения селекта.
Tom Select ожидает массив объектов, где каждый элемент описывает одну опцию. Минимально необходимая структура включает два поля:
value — уникальный идентификатор значенияtext — отображаемый текстПример базового набора:
const options = [
{ value: "ru", text: "Русский" },
{ value: "en", text: "Английский" },
{ value: "de", text: "Немецкий" }
];
При передаче такого массива библиотека автоматически преобразует его в список доступных вариантов.
Статическая загрузка реализуется через параметр options
при создании экземпляра Tom Select:
new TomSelect("#select-language", {
options: [
{ value: "ru", text: "Русский" },
{ value: "en", text: "Английский" },
{ value: "de", text: "Немецкий" }
]
});
В данном случае исходный <select> может быть
пустым, поскольку весь список формируется из конфигурации
JavaScript.
<select>Если необходимо сохранить семантику HTML-разметки, статические данные
могут быть переданы через <option> элементы. Tom
Select автоматически считывает их при инициализации:
<select id="select-language">
<option value="ru">Русский</option>
<option value="en">Английский</option>
<option value="de">Немецкий</option>
</select>
new TomSelect("#select-language");
В этом случае библиотека парсит DOM и строит внутреннюю структуру данных без дополнительной конфигурации.
Каждая опция может содержать дополнительные свойства, которые используются для кастомного рендеринга или логики фильтрации. Стандартная структура может быть расширена произвольными полями:
const options = [
{
value: "ru",
text: "Русский",
region: "EU",
active: true
},
{
value: "en",
text: "Английский",
region: "Global",
active: true
}
];
Такие данные не отображаются автоматически, но доступны в шаблонах и событиях.
labelField и
valueFieldПри использовании нестандартной структуры данных необходимо явно указать, какие поля отвечают за отображение и значение:
new TomSelect("#select-language", {
options: [
{ code: "ru", name: "Русский" },
{ code: "en", name: "Английский" }
],
valueField: "code",
labelField: "name"
});
Здесь:
valueField определяет поле для внутреннего
значенияlabelField определяет текст, отображаемый
пользователюДля структурированных списков используется поле
optgroup. Оно позволяет разделять элементы на логические
категории.
new TomSelect("#select-language", {
optgroups: [
{ value: "europe", label: "Европа" },
{ value: "asia", label: "Азия" }
],
options: [
{ value: "ru", text: "Русский", optgroup: "europe" },
{ value: "de", text: "Немецкий", optgroup: "europe" },
{ value: "jp", text: "Японский", optgroup: "asia" }
],
optgroupField: "optgroup"
});
Такое разделение улучшает восприятие длинных списков и упрощает навигацию.
При статической загрузке Tom Select опирается на уникальность поля
value. Если в массиве присутствуют дубликаты, поведение
становится непредсказуемым: могут быть перезаписаны элементы или
нарушена логика выбора. Поэтому необходимо обеспечивать уникальность
идентификаторов на уровне данных.
Статические данные позволяют легко задать начальное состояние
компонента. Для этого используется свойство items:
new TomSelect("#select-language", {
options: [
{ value: "ru", text: "Русский" },
{ value: "en", text: "Английский" }
],
items: ["en"]
});
В результате элемент с value: "en" будет выбран сразу
после инициализации.
Если используется HTML <select>, начальное
состояние определяется атрибутом selected:
<option value="en" selected>Английский</option>
Хотя данные считаются статическими, Tom Select допускает их замену в рантайме через API:
const select = new TomSelect("#select-language");
select.clearOptions();
select.addOption({ value: "fr", text: "Французский" });
select.addOption({ value: "es", text: "Испанский" });
select.refreshOptions(false);
Такой подход фактически переводит компонент из статического режима в динамический, но без использования удалённого источника данных.
Встроенный механизм поиска работает поверх массива
options. Фильтрация осуществляется по полю
labelField, что позволяет мгновенно находить совпадения без
запросов к серверу.
Поведение поиска можно изменить через параметр
score:
new TomSelect("#select-language", {
options: [
{ value: "ru", text: "Русский" },
{ value: "en", text: "Английский" }
],
score: function(search) {
return function(item) {
return item.text.toLowerCase().includes(search.toLowerCase()) ? 1 : 0;
};
}
});
При работе с большим количеством элементов (сотни или тысячи записей) важно учитывать производительность. Основные ограничения связаны не с хранением данных, а с рендерингом DOM-элементов.
Ключевые подходы:
Tom Select выполняет фильтрацию на клиенте, поэтому сложность поиска линейно зависит от размера массива.
Каждая опция может быть визуально переопределена через шаблоны
render. Это особенно полезно при использовании расширенных
объектов:
new TomSelect("#select-language", {
options: [
{ value: "ru", text: "Русский", flag: "??" },
{ value: "en", text: "Английский", flag: "??" }
],
render: {
option: function(data) {
return `<div>${data.flag} ${data.text}</div>`;
},
item: function(data) {
return `<div>${data.flag} ${data.text}</div>`;
}
}
});
Такой подход не влияет на структуру данных, но изменяет визуальное представление элементов.
При статической загрузке важно учитывать, что Tom Select хранит
внутреннее состояние отдельно от исходного массива. Изменения в исходной
переменной options после инициализации не влияют на
компонент. Все модификации должны выполняться через API библиотеки.
Часто встречаются следующие проблемы:
valuelabelField фактической структуре
объекта<option> и JavaScript
options без понимания приоритетаПриоритет всегда отдаётся JavaScript-конфигурации, если она указана явно.
Если массив options пуст, компонент остаётся активным,
но не отображает доступных значений. Поиск также не возвращает
результатов. Такое состояние может использоваться как временный режим до
загрузки данных в рантайме.