Обновление интерфейса в Tom Select опирается на внутреннюю модель
состояния экземпляра и набор методов, которые синхронизируют данные
(options/items/value) с DOM. В отличие от простого
<select>, библиотека поддерживает собственный слой
рендеринга, где любое изменение состояния может приводить к частичной
или полной переработке UI: списка опций, выбранных элементов, инпута
поиска и состояния раскрытия.
Список доступных опций управляется через внутреннюю коллекцию
options. Любое изменение этой коллекции требует
синхронизации выпадающего меню, иначе интерфейс останется в устаревшем
состоянии.
refreshOptions() — ключевой метод, отвечающий за перерисовку списка опций в dropdown.
Он используется, когда:
optionsload)const select = new TomSelect('#select');
select.addOption({ value: '1', text: 'Option 1' });
select.refreshOptions();
Метод не изменяет данные, а только пересобирает DOM-список на основе
текущего состояния options. Внутри происходит очистка
контейнера dropdown и повторный вызов render-функций для каждой
доступной опции.
При работе с динамической загрузкой данных
refreshOptions() часто вызывается автоматически после
load() или addOption().
clearOptions() полностью очищает список доступных опций.
select.clearOptions();
select.refreshOptions();
После вызова коллекция options становится пустой, а
интерфейс dropdown перестаёт отображать элементы. Важно, что это не
влияет на уже выбранные значения (items), если они не
связаны напрямую с очищаемыми опциями.
updateOption(value, data) применяется для изменения конкретной опции без полной пересборки списка.
select.updateOption('1', {
value: '1',
text: 'Updated label'
});
Метод заменяет данные внутри options[value] и при
необходимости обновляет DOM-элемент, если он уже отрендерен в выпадающем
списке. В зависимости от состояния dropdown может происходить либо
точечное обновление, либо отложенная перерисовка при следующем
refreshOptions().
Отдельным слоем интерфейса являются выбранные элементы (items),
отображаемые внутри control-инпута. Их синхронизация управляется через
refreshItems().
refreshItems() обновляет отображение выбранных значений.
select.setValue(['1', '2']);
select.refreshItems();
Метод используется, когда:
Внутренне происходит:
item rendererПри частых изменениях значений refreshItems() может
вызываться многократно, поэтому библиотека поддерживает оптимизацию
через “тихий режим” (silent updates).
select.setValue(['1', '2'], true);
Флаг silent предотвращает автоматический вызов
обновления UI, позволяя сгруппировать несколько изменений перед единым
refreshItems().
Метод render() используется для принудительного пересоздания интерфейсных частей компонента.
select.render('option', select.options['1'], null);
Однако чаще render() применяется косвенно внутри других
методов. Он отвечает за генерацию HTML-фрагментов через шаблоны,
определённые в конфигурации:
optionitemoptgroup_headerloadingПри кастомизации интерфейса именно render() становится
точкой расширения, где можно контролировать HTML каждого элемента.
Принудительный вызов render() применяется редко и обычно
в случаях глубокой кастомизации, когда требуется вручную перестроить
конкретный узел без изменения состояния.
Tom Select разделяет логическое состояние и DOM-представление. Основные структуры:
options — доступные элементыitems — выбранные элементыvalue — сериализованное значениеdropdown_content — контейнер спискаcontrol — контейнер выбранных значенийМетоды обновления интерфейса всегда опираются на эти структуры.
refreshOptions() работает с
options.
refreshItems() работает с items.
setValue() синхронизирует value и
items, после чего может инициировать UI-обновление.
select.setValue('1');
При этом последовательность обновления обычно следующая:
Хотя setValue() формально не относится к UI-методам, он
является триггером обновления интерфейса.
select.setValue(['1', '2']);
При вызове:
this.itemsЕсли передан второй аргумент silent, интерфейс не
обновляется автоматически:
select.setValue(['1', '2'], true);
select.refreshItems();
Такая схема используется для пакетных изменений, когда важно избежать лишних перерисовок.
При использовании load() интерфейс обновляется
асинхронно. Метод принимает callback, в котором необходимо передать
новые опции.
select.load(function(callback) {
fetch('/api/options')
.then(res => res.json())
.then(data => {
callback(data);
select.refreshOptions();
});
});
После выполнения callback:
optionsЕсли загрузка происходит при открытом меню, UI обновляется сразу, иначе — откладывается до открытия.
Метод clear() влияет одновременно на значения и отображение выбранных элементов.
select.clear();
Внутри происходит:
itemsvalueВ отличие от clearOptions(), который работает со списком
доступных значений, clear() сбрасывает именно выбор
пользователя.
Комбинация методов часто используется для полного сброса:
select.clear();
select.clearOptions();
select.refreshOptions();
В случаях, когда состояние было изменено напрямую (например, через
прямую модификацию options), применяется ручная
синхронизация:
select.options['1'] = { value: '1', text: 'New' };
select.refreshOptions();
Без вызова refreshOptions() DOM останется в старом
состоянии, так как Tom Select не отслеживает глубокие изменения объектов
автоматически.
Внутренний кэш используется для ускорения рендеринга и поиска. Методы обновления интерфейса могут затрагивать его:
refreshOptions() пересобирает отображаемый список, но
не всегда очищает кэш поискаclearCache() сбрасывает внутренние закэшированные
результатыselect.clearCache();
select.refreshOptions();
Использование актуально при динамическом изменении данных, когда
старые результаты поиска могут конфликтовать с новыми
options.
Особенность обновлений заключается в зависимости от состояния раскрытия списка:
select.open();
select.addOption({ value: '3', text: 'Option 3' });
select.refreshOptions();
В этом режиме происходит инкрементальная перерисовка без полного пересоздания контейнера, чтобы сохранить позицию скролла и фокус.
При массовых изменениях данных используется стратегия пакетного обновления:
select.setValue(['1', '2', '3'], true);
select.addOption({ value: '4', text: 'Option 4' });
select.addOption({ value: '5', text: 'Option 5' });
select.refreshItems();
select.refreshOptions();
Смысл подхода:
Оба метода часто вызываются совместно, но отвечают за разные части интерфейса.
select.refreshOptions();
select.refreshItems();
Типичный сценарий:
Порядок может быть важен, если новые опции влияют на отображение выбранных элементов (например, обновление текста label у уже выбранных items).
В крайних случаях, когда интерфейс полностью рассинхронизирован, применяется полный пересоздание экземпляра:
select.destroy();
select = new TomSelect('#select');
Такой подход сбрасывает:
Используется как последний уровень обновления интерфейса, когда точечные методы перестают давать предсказуемый результат.