Метод destroy

Метод destroy в Flatpickr предназначен для полного удаления экземпляра календаря вместе со всеми связанными ресурсами, обработчиками событий и изменениями DOM. Он используется в ситуациях, когда компонент больше не нужен на странице, должен быть пересоздан с новой конфигурацией или требуется освобождение памяти в долгоживущих SPA-приложениях.

Основная задача destroy() заключается в безопасном демонтаже ранее инициализированного экземпляра календаря. При обычной работе Flatpickr изменяет структуру DOM, добавляет слушатели событий, создаёт вспомогательные элементы интерфейса и хранит внутреннее состояние. Без корректного удаления это приводит к накоплению «мусора» в памяти и потенциальным конфликтам при повторной инициализации.

Метод обеспечивает:

  • удаление DOM-обёртки календаря;
  • восстановление исходного состояния input-элемента;
  • снятие всех событийных подписок;
  • очистку внутренних ссылок экземпляра.

Сигнатура и доступ

Метод вызывается на экземпляре Flatpickr:

instance.destroy();

где instance — результат инициализации календаря:

const fp = flatpickr("#date", {
  enableTime: true
});

fp.destroy();

После вызова объект экземпляра перестаёт быть функциональным как календарь.

Поведение при вызове destroy

При выполнении destroy() происходит последовательная цепочка операций, направленных на полное восстановление DOM и освобождение ресурсов.

Удаление UI-контейнеров

Flatpickr создаёт отдельный контейнер календаря, который позиционируется относительно input. При уничтожении:

  • контейнер календаря удаляется из DOM;
  • вспомогательные элементы (стрелки, панели, списки месяцев/дней) также удаляются;
  • убираются классы, добавленные для стилизации активного состояния.

Восстановление input-элемента

Исходный input возвращается в состояние, максимально близкое к первоначальному:

  • удаляются дополнительные атрибуты, связанные с календарём;
  • сбрасываются обработчики фокуса и кликов, привязанные библиотекой;
  • восстанавливается нативное поведение поля ввода.

Важно учитывать, что значение input при этом не очищается автоматически. Оно остаётся таким, каким было на момент вызова destroy().

Очистка событий

Одним из ключевых аспектов является снятие всех подписанных событий:

  • click-события по документу;
  • события изменения даты;
  • обработчики открытия/закрытия календаря;
  • события клавиатуры (Escape, стрелки, Enter).

Это предотвращает утечки памяти и «висящие» обработчики, которые могут срабатывать после удаления UI.

Внутренние состояния и ссылки

Flatpickr хранит внутренние ссылки на DOM-элементы и состояние выбора даты. При вызове destroy():

  • обнуляются ссылки на календарный контейнер;
  • очищаются массивы выбранных дат (внутреннее состояние становится неактивным);
  • отключается логика обновления интерфейса.

После этого экземпляр фактически перестаёт быть управляемым компонентом.

Повторная инициализация после destroy

Частый сценарий — повторное создание календаря на том же элементе после уничтожения предыдущего экземпляра.

fp.destroy();

const fp2 = flatpickr("#date", {
  dateFormat: "Y-m-d"
});

В этом случае важно, чтобы старый экземпляр был полностью уничтожен, иначе возможны конфликты обработчиков и дублирование UI.

Некоторые реализации требуют явного удаления ссылки:

fp.destroy();
fp = null;

Это дополнительно помогает сборщику мусора освободить память.

Отличие от других методов управления

Метод destroy() принципиально отличается от методов управления отображением:

  • close() только скрывает календарь;
  • open() отображает его;
  • clear() сбрасывает значение;
  • destroy() полностью удаляет компонент.

После destroy() любые вызовы open() или close() становятся недействительными, так как экземпляр теряет связанную DOM-структуру.

Сценарии использования

Удаление в SPA при смене маршрута

В одностраничных приложениях календарь часто создаётся при загрузке компонента. При переходе на другой маршрут необходимо вызывать destroy() для предотвращения накопления экземпляров.

Пересоздание с новой конфигурацией

При динамическом изменении настроек (например, смена формата даты или локали) удобнее уничтожить текущий экземпляр и создать новый.

Очистка модальных окон

Если календарь используется внутри модального окна, его следует уничтожать при закрытии окна, чтобы не сохранять скрытые обработчики событий.

Поведение при повторном вызове destroy

Если вызвать destroy() повторно на уже уничтоженном экземпляре, поведение зависит от версии библиотеки и состояния объекта. Обычно:

  • метод становится безопасно-идемпотентным;
  • повторное выполнение не приводит к ошибке;
  • часть операций пропускается из-за отсутствия внутренних ссылок.

Однако полагаться на повторный вызов как на нормальную практику не рекомендуется.

Типичные ошибки использования

Сохранение ссылки на DOM после уничтожения

Если сохраняются ссылки на элементы календаря до вызова destroy(), они становятся «висячими» и не отражают актуальное состояние интерфейса.

Повторное использование экземпляра

Попытка продолжить работу с экземпляром после уничтожения приводит к некорректному поведению, так как внутренние структуры уже удалены.

Утечки памяти при отсутствии destroy

В сложных интерфейсах без явного вызова destroy():

  • растёт количество обработчиков событий;
  • сохраняются закрытые DOM-узлы;
  • увеличивается потребление памяти при навигации.

Особенности работы с мобильными устройствами

На мобильных устройствах Flatpickr часто создаёт упрощённые интерфейсы. При destroy() дополнительно очищаются:

  • touch-события;
  • обработчики скролла;
  • фиксация viewport при открытом календаре.

Это особенно важно для предотвращения «залипания» интерфейса после закрытия компонентов.

Взаимодействие с CSS

При уничтожении экземпляра:

  • удаляются классы состояния (open, selected, hasTime и др.);
  • сбрасывается визуальная привязка календаря к input;
  • возвращается стандартный внешний вид поля ввода.

Если использовались кастомные стили, завязанные на классы Flatpickr, они перестают применяться автоматически после вызова метода.

Поведение при асинхронных обновлениях

Если в момент вызова destroy() выполняются асинхронные операции (например, обновление даты через API или таймер), они могут попытаться обратиться к уже несуществующим DOM-элементам. Это приводит к необходимости предварительной остановки внешних процессов перед уничтожением экземпляра.

Практика управления жизненным циклом

Метод destroy() рассматривается как финальная стадия жизненного цикла экземпляра календаря. Корректное использование включает:

  • инициализацию;
  • работу с пользователем;
  • завершение взаимодействия;
  • полное удаление через destroy.

Такой подход обеспечивает предсказуемое поведение интерфейса и стабильность приложения при длительной работе.