Библиотека Tom Select строит состояние вокруг нескольких взаимосвязанных сущностей: выбранные значения, список доступных опций, текстовое поле ввода и состояние выпадающего списка. Эти элементы не существуют изолированно — любое изменение одного слоя почти всегда приводит к пересборке или синхронизации остальных.
Ключевые компоненты состояния:
Tom Select поддерживает как декларативное обновление через методы API, так и императивное управление внутренним состоянием с возможностью подавления побочных эффектов.
Метод setValue является базовой точкой синхронизации
состояния. Он полностью заменяет текущий набор выбранных значений.
select.setValue("value1");
select.setValue(["value1", "value2"]);
Поддерживается как одиночное значение, так и массив. В случае
мультиселекта происходит полная перезапись массива
items.
Дополнительный параметр silent отключает триггеры
событий и визуальные обновления:
select.setValue(["a", "b"], true);
Метод добавляет новый элемент в состояние без полной замены существующего набора.
select.addItem("value1");
Особенности поведения:
optionsС подавлением событий:
select.addItem("value1", true);
Удаление конкретного значения из текущего состояния:
select.removeItem("value1");
При удалении происходит:
itemsSilent-режим:
select.removeItem("value1", true);
Полная очистка выбранных значений:
select.clear();
Эквивалент удаления всех items с последующей
синхронизацией интерфейса.
Silent-режим:
select.clear(true);
Метод напрямую управляет содержимым input-поля внутри компонента.
select.setTextboxValue("search text");
Используется для:
Добавление новой опции в доступный список значений:
select.addOption({
value: "new_value",
text: "New Label"
});
Особенности:
Обновление существующей опции по ключу:
select.updateOption("value1", {
text: "Updated Label"
});
Поведение:
Полная очистка списка доступных опций:
select.clearOptions();
После вызова:
Метод пересчитывает и перерисовывает список опций на основе текущего состояния фильтра.
select.refreshOptions();
Применяется при:
Метод sync приводит DOM-состояние компонента к
внутреннему состоянию модели.
select.sync();
Используется в ситуациях:
<select>Процесс синхронизации включает:
Хотя эти методы напрямую не меняют data-state, они влияют на интерактивное состояние компонента:
select.focus();
select.blur();
focus активирует input и открывает взаимодействие с
dropdownblur завершает редактирование и закрывает списокКаждое изменение состояния в Tom Select проходит через цепочку:
items / options)change, item_add,
item_remove и др.)Для оптимизации используется механизм пакетных обновлений через
silent режим, который подавляет каскадные события:
select.addItem("value1", true);
select.addOption({ value: "v2", text: "V2" });
select.refreshOptions();
select.sync();
В таком сценарии перерисовка может быть отложена до финального вызова синхронизации.
В реальных сценариях состояние часто изменяется группами операций:
select.clear(true);
select.addOption({ value: "1", text: "One" });
select.addOption({ value: "2", text: "Two" });
select.setValue(["1", "2"], true);
select.refreshOptions();
Такой подход позволяет:
Tom Select допускает временные несоответствия между
items и options, которые устраняются при
следующих операциях:
sync() — восстановление полной согласованностиrefreshOptions() — пересчёт видимых элементовsetValue() — принудительная нормализация выбранных
значенийПри этом внутренний механизм старается поддерживать минимально необходимую консистентность, чтобы интерфейс оставался предсказуемым даже при асинхронных обновлениях данных.
Изменения состояния сопровождаются цепочкой событий:
item_additem_removechangeoption_add,
option_removeinitialize, dropdown_open,
dropdown_closeЭти события являются частью реактивного слоя, связывающего внутреннюю модель с визуальным представлением компонента.