Жизненный цикл экземпляра Tom Select включает не только инициализацию и работу с данными, но и корректное завершение. Удаление экземпляра требуется при динамических интерфейсах, переходах между страницами в SPA, повторной инициализации компонентов, а также при очистке ресурсов для предотвращения утечек памяти и накопления обработчиков событий.
Базовый способ завершения работы экземпляра реализуется через метод
destroy():
const tomSelect = new TomSelect('#select', {
create: true,
persist: false
});
// уничтожение экземпляра
tomSelect.destroy();
После вызова destroy() библиотека выполняет комплексное
восстановление исходного состояния элемента и очистку всех внутренних
структур.
Процесс уничтожения включает несколько последовательных этапов:
<select>Tom Select заменяет стандартный <select> кастомной
разметкой. При уничтожении выполняется обратная операция:
<select> в DOMСозданные элементы интерфейса полностью удаляются:
.ts-wrapperЭто гарантирует отсутствие «мусора» в DOM после уничтожения.
Одной из ключевых задач является очистка обработчиков:
Отсутствие корректной отписки приводит к утечкам памяти, особенно в SPA.
Удаляются внутренние состояния экземпляра:
После этого объект экземпляра фактически перестаёт быть функциональным.
Если использовались плагины Tom Select, например:
remove_buttondropdown_inputvirtual_scrollони также корректно деинициализируются, освобождая привязанные ресурсы и события.
После вызова destroy() исходный
<select> снова становится обычным HTML-элементом, что
позволяет повторно создать экземпляр:
tomSelect.destroy();
const newInstance = new TomSelect('#select', {
create: true
});
Важно учитывать, что повторная инициализация должна выполняться только после полного удаления старого экземпляра, иначе возможны дубли DOM-структур.
В SPA-приложениях уничтожение экземпляра становится обязательной практикой при смене компонентов.
let tsInstance;
function mountSelect() {
tsInstance = new TomSelect('#select');
}
function unmountSelect() {
if (tsInstance) {
tsInstance.destroy();
tsInstance = null;
}
}
При программной замене блока, содержащего
<select>, необходимо предварительно уничтожить
экземпляр:
function replaceBlock() {
tsInstance.destroy();
document.querySelector('#container').innerHTML = `
<select id="select"></select>
`;
tsInstance = new TomSelect('#select');
}
Игнорирование этого шага приводит к «осиротевшим» обработчикам и некорректному поведению интерфейса.
При работе с формами важно учитывать следующие особенности:
<select> сохраняются в DOM-элементеdestroy() форма возвращается к стандартному
поведениюПример:
const ts = new TomSelect('#tags');
document.querySelector('form').addEventListener('submit', () => {
ts.destroy();
});
Неправильное использование destroy часто связано с несколькими сценариями:
ts.destroy();
ts.destroy(); // ошибка логики
Второй вызов может приводить к ошибкам, так как экземпляр уже не существует.
new TomSelect('#select').destroy();
В этом случае отсутствует возможность управлять экземпляром после создания, что усложняет контроль жизненного цикла.
Если события навешивались вручную вне Tom Select, они не удаляются автоматически:
document.addEventListener('click', handler);
После destroy() такие обработчики остаются активными и
требуют ручной очистки.
При частом создании и уничтожении экземпляров следует учитывать:
id<select>Наиболее частые причины утечек:
В интерфейсах с динамическими вкладками или модальными окнами часто используется паттерн «монтаж/размонтирование»:
class SelectController {
constructor(selector) {
this.selector = selector;
this.instance = null;
}
mount() {
this.instance = new TomSelect(this.selector);
}
unmount() {
if (this.instance) {
this.instance.destroy();
this.instance = null;
}
}
}
Такой подход обеспечивает предсказуемость состояния и исключает накопление ресурсов.
После уничтожения:
Любые операции над ним после уничтожения считаются некорректными.
<select>