При работе с библиотекой Dragula крайне важно корректно управлять жизненным циклом её экземпляров. Одним из ключевых аспектов является уничтожение экземпляра после завершения работы с элементами, чтобы избежать утечек памяти, некорректного поведения интерфейса и конфликтов при повторной инициализации.
destroy()Каждый экземпляр Dragula создаётся функцией
dragula(containers, options), где containers —
массив DOM-элементов, а options — объект конфигурации. Для
уничтожения экземпляра используется метод:
const drake = dragula([container1, container2], { /* options */ });
// В какой-то момент
drake.destroy();
Особенности метода destroy():
gu-mirror,
gu-hide, gu-transit).Во время перетаскивания Dragula создаёт вспомогательные элементы:
gu-mirror — элемент-копия перетаскиваемого
объекта.gu-transit — класс, добавляемый на оригинальный элемент
на время перетаскивания.gu-hide — скрывает элемент в исходном контейнере, пока
он переносится.Метод destroy() автоматически очищает эти элементы и
снимает классы, чтобы не оставалось “мусора” в DOM.
drake.destroy();
// После вызова не останется gu-mirror и gu-transit
Dragula предоставляет обширный API для событий:
drake.on('drag', (el) => { /* ... */ });
drake.on('drop', (el, target, source, sibling) => { /* ... */ });
После вызова destroy():
drake не
будут вызваны.Если интерфейс позволяет пользователю изменять набор контейнеров или полностью обновлять список элементов:
drake.destroy();
const newDrake = dragula([newContainer1, newContainer2]);
Для временного отключения функционала без удаления DOM:
if (disableDrag) {
drake.destroy();
}
При SPA или одностраничных приложениях важно очищать все экземпляры:
allDrakes.forEach(d => d.destroy());
allDrakes = [];
destroy() при удалении контейнеров из DOM. Это
предотвращает утечки памяти и ошибки в будущем.destroy(); создаётся новый объект.drake.cancel(true) или
drake.off(event, handler) для частичной отписки, но полное
уничтожение обеспечивает чистоту и безопасность кода.Метод destroy() является завершающим этапом работы с
экземпляром и взаимодействует с другими методами Dragula следующим
образом:
drake.remove() — удаляет элемент из контейнера, но не
уничтожает экземпляр.drake.cancel() — прерывает текущее перетаскивание, но
не отключает Dragula.drake.destroy() — отключает полностью и снимает все
привязки событий.Таким образом, destroy() является ключевым
инструментом управления жизненным циклом Dragula, обеспечивая
стабильность интерфейса и предотвращение накопления ненужных
обработчиков и временных элементов.