В Popper.js управление жизненным циклом экземпляра является
критически важным для корректной работы интерфейса и оптимизации
производительности. После создания поппера (экземпляра
Popper) иногда возникает необходимость полностью удалить
его из DOM и остановить все внутренние процессы. Для этого используется
метод destroy.
destroy()Метод destroy() служит для полного удаления экземпляра
поппера. Он выполняет следующие действия:
reference). Метод
destroy() снимает эти слушатели, что предотвращает утечки
памяти.destroy() все inline-стили и атрибуты, которые были
установлены библиотекой, сбрасываются.update() или автоматические обновления, связанные с
requestAnimationFrame, прекращаются.Пример использования:
import { createPopper } from '@popperjs/core';
const button = document.querySelector('#button');
const tooltip = document.querySelector('#tooltip');
const popperInstance = createPopper(button, tooltip, {
placement: 'top',
});
// Позже, когда поппер больше не нужен
popperInstance.destroy();
После вызова destroy() объект
popperInstance становится неактивным. Любые дальнейшие
попытки вызова методов update() или
forceUpdate() приведут к ошибкам или не будут иметь
эффекта.
Если элемент-цель (reference) или всплывающий элемент
(popper) удаляются из DOM без вызова
destroy(), Popper продолжает существовать в памяти, что
может привести к утечкам памяти и ненужным событиям. Для предотвращения
этого рекомендуется:
destroy() перед удалением элементов из
DOM.MutationObserver для отслеживания удаления
элементов, если уничтожение должно происходить автоматически.Пример с MutationObserver:
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
mutation.removedNodes.forEach((node) => {
if (node === tooltip) {
popperInstance.destroy();
}
});
});
});
observer.observe(document.body, { childList: true, subtree: true });
destroy() и disableEventListeners()Popper.js также предоставляет метод
disableEventListeners(), который лишь отключает слежение за
событиями, но оставляет элементы на странице и сохраняет текущие стили.
Отличие от destroy():
| Метод | Действие |
|---|---|
destroy() |
Полное удаление экземпляра, очистка стилей, отключение обновлений и событий |
disableEventListeners() |
Отключение только событий, текущая позиция поппера сохраняется |
Пример использования disableEventListeners():
popperInstance.disableEventListeners();
// Поппер останется видимым на странице, но больше не будет реагировать на скролл и resize
destroy() при удалении или скрытии
элементов, чтобы избежать утечек памяти.disableEventListeners().destroy() объект экземпляра можно безопасно
присвоить null для очистки ссылок:popperInstance.destroy();
popperInstance = null;
Это гарантирует, что сборщик мусора сможет полностью освободить память, используемую Popper.js.
В сложных интерфейсах с динамически создаваемыми тултипами, дропдаунами или модальными окнами правильное уничтожение экземпляров обеспечивает:
Управление жизненным циклом экземпляра Popper.js с использованием
destroy() является ключевым элементом правильной интеграции
библиотеки в сложные веб-приложения.