Инициализация экземпляра Flatpickr запускает первичный цикл событий,
в котором формируется базовое состояние календаря, подготавливается
DOM-разметка и устанавливаются внутренние ссылки на элементы управления.
На этом этапе ключевую роль играет событие onReady,
фиксирующее момент полной готовности виджета к взаимодействию. Оно
всегда происходит после построения календаря, но до первого
пользовательского взаимодействия и до большинства событий, связанных с
выбором дат.
После вызова flatpickr(element, options) библиотека
проходит несколько внутренних стадий, каждая из которых может
сопровождаться событиями:
onReadyНа этом этапе важно понимать, что onReady является
точкой синхронизации: любые модификации DOM, стилизация или программное
вмешательство в структуру календаря наиболее безопасны именно здесь.
При первом взаимодействии пользователя или программном вызове
instance.open() запускается последовательность
открытия:
Событие onOpen срабатывает после того, как календарь
становится видимым, но до завершения всех визуальных переходов. Это
делает его критически важным для логики, завязанной на появление UI,
например динамической подгрузки данных или изменения интерфейса
страницы.
Центральная часть жизненного цикла Flatpickr связана с выбором даты.
При клике по дню или программном вызове setDate()
формируется последовательность:
Здесь возникает ключевой порядок событий:
onValueUpdate → onChange
onValueUpdate срабатывает при любом изменении
внутреннего массива выбранных значений. Это событие фиксирует факт
обновления состояния, независимо от источника изменения:
пользовательский клик, API-вызов или массовая установка диапазона
дат.
Характерная особенность — оно вызывается чаще, чем
onChange, и может срабатывать даже при промежуточных
изменениях, например при выборе диапазона дат.
onChange вызывается после того, как изменение считается
завершённым и стабилизированным. В отличие от
onValueUpdate, оно ориентировано на финальный результат
взаимодействия пользователя.
Типичная последовательность при выборе одной даты:
onValueUpdateonChangeПри выборе диапазона дат возможна многократная активация
onValueUpdate до финального onChange.
Переключение между месяцами и годами формирует отдельный поток событий, не связанный напрямую с выбором даты.
Срабатывает при изменении месяца, независимо от причины:
changeMonthПорядок внутри операции:
onMonthChangeАналогично, но для изменения года:
onYearChangeВажно, что при смене месяца и года одновременно (например, декабрь → январь следующего года) события могут следовать последовательно:
onMonthChangeonYearChangeили наоборот, в зависимости от механизма перехода, но всегда после завершения перерасчёта UI.
Каждый день в календарной сетке создаётся динамически, и для него
может вызываться onDayCreate. Это событие относится к более
низкому уровню рендеринга.
Срабатывает при создании DOM-элемента конкретного дня. Последовательность:
onDayCreate для каждого элементаЭто событие часто используется для кастомной стилизации: добавления классов, меток, индикаторов событий.
Особенность заключается в том, что onDayCreate может
вызываться многократно при:
Закрытие календаря формирует завершающий поток взаимодействия:
Событие onClose срабатывает после начала процесса
закрытия, когда интерфейс уже считается неактивным, но DOM ещё может
быть доступен для операций.
Типичная последовательность при закрытии:
onCloseПри стандартном сценарии (одна дата, без диапазона) последовательность выглядит следующим образом:
onReady — при инициализацииonOpen — при открытииonValueUpdate — при выборе датыonChange — фиксация измененияonClose — завершение взаимодействияДополнительно могут быть вставлены:
onMonthChange — при навигацииonYearChange — при смене годаonDayCreate — при рендере сеткиРежим range существенно усложняет последовательность событий. При выборе начальной и конечной даты:
onValueUpdate без
onChangeonChangeВнутренний поток становится итеративным:
onValueUpdateonValueUpdateonChangeПри использовании API (setDate, jumpToDate,
clear) порядок событий может отличаться от
пользовательского сценария.
Например, при setDate:
onValueUpdateonChange (если не подавлен опцией)При этом onOpen и onClose не всегда
вызываются при программных изменениях.
Некоторые параметры изменяют порядок или частоту событий:
enableTime добавляет дополнительные стадии пересчёта
значенияinline убирает onOpen и
onClose как пользовательские событияmode: "multiple" увеличивает количество
onValueUpdateallowInput добавляет внешние триггеры для
onChangeFlatpickr использует синхронную модель событий, где большинство коллбеков вызываются сразу после завершения соответствующего шага обработки. Это означает отсутствие задержек между обновлением состояния и вызовом обработчиков.
Приоритет условно можно представить так:
onDayCreate (если рендер)onValueUpdateonChangeonOpen,
onClose)События Flatpickr не являются изолированными. Например:
onMonthChange всегда предшествует
onDayCreateonValueUpdate может вызываться несколько раз до
onChangeonOpen может сопровождаться последующим
onMonthChange при автоматической корректировке датыonYearChange часто сопровождает полную переразметку
календаряТакое поведение формирует предсказуемую, но многоуровневую модель событий, где важно учитывать контекст вызова, а не только название callback.
При построении сложной логики взаимодействия с календарём используется комбинирование событий:
onReady для инициализации состоянияonOpen для загрузки внешних данныхonDayCreate для модификации UI каждого дняonValueUpdate для реактивного отслеживания
измененийonChange для фиксации результатаonClose для очистки состоянияТакая структура позволяет выстроить детерминированную последовательность, в которой каждый этап связан с конкретным моментом жизненного цикла компонента.