Событие onYearChange в Flatpickr относится к группе
календарных callback-функций и вызывается каждый раз, когда изменяется
отображаемый год в интерфейсе календаря. Это изменение может происходить
как в результате пользовательской навигации (стрелки переключения года,
выбор даты за пределами текущего года), так и при программном управлении
состоянием календаря через API экземпляра.
onYearChange срабатывает в момент, когда внутреннее
состояние календаря фиксирует переход между годами. При этом важно
различать:
Событие связано именно с изменением отображаемого года, а не обязательно с изменением выбранного значения.
Внутри Flatpickr календарь хранит текущее состояние навигации, включая:
currentYear);onYearChange реагирует только на обновление
currentYear.
Callback, передаваемый в onYearChange, имеет стандартную
форму:
onYearChange: function(selectedDates, dateStr, instance) {
// логика обработки смены года
}
selectedDates Массив объектов Date,
содержащий выбранные даты. Важно: изменение года не гарантирует
изменение выбранной даты.
dateStr Строковое представление выбранной даты в
формате, заданном через dateFormat. Может оставаться
неизменным при смене года, если пользователь не меняет выбор.
instance Экземпляр календаря Flatpickr, содержащий полное состояние компонента и API управления.
Типичная регистрация обработчика выглядит следующим образом:
flatpickr("#datepicker", {
onYearChange: function(selectedDates, dateStr, instance) {
console.log("Год изменён:", instance.currentYear);
}
});
В данном примере используется доступ к
instance.currentYear, который отражает актуальный
отображаемый год после переключения.
Изменение года может происходить несколькими способами:
Во всех этих случаях onYearChange будет вызван после
того, как внутреннее состояние календаря обновит год.
onYearChange часто используется вместе с другими
callback-ами:
onMonthChange — изменение месяца;onChange — изменение выбранной даты;onOpen и onClose — открытие и закрытие
календаря;onReady — первичная инициализация.В отличие от них, onYearChange изолированно отслеживает
только изменение года, даже если остальные части состояния остаются
прежними.
Поведение этих событий часто путают, однако их семантика различается строго:
onYearChange — фиксирует смену года отображения;onMonthChange — фиксирует смену месяца.Смена месяца может привести к смене года (например, декабрь → январь), и в этом случае:
onYearChange вызывается отдельно.Экземпляр Flatpickr предоставляет доступ к внутреннему состоянию:
onYearChange: function(selectedDates, dateStr, instance) {
const year = instance.currentYear;
if (year < 2000) {
console.log("Выбран устаревший диапазон");
}
}
currentYear обновляется синхронно с интерфейсом
календаря, что позволяет использовать его для динамических ограничений и
загрузки данных.
onYearChange: function(selectedDates, dateStr, instance) {
fetch(`/api/events?year=${instance.currentYear}`)
.then(res => res.json())
.then(data => {
console.log("События загружены:", data);
});
}
onYearChange: function(selectedDates, dateStr, instance) {
document.querySelector("#yearLabel").textContent =
instance.currentYear;
}
onYearChange: function(selectedDates, dateStr, instance) {
updateFilters({
year: instance.currentYear
});
}
Если заданы параметры minDate и maxDate,
изменение года может быть ограничено. В этом случае:
onYearChange может не вызываться, если фактического
изменения не произошло.Смена года не обязательно означает изменение выбранной даты:
selectedDates остаётся прежним;dateStr может не обновляться.В режимах mode: "multiple" или
mode: "range":
onYearChange не влияет на структуру массива дат;При смене года интерфейс может пересчитывать отображение дат с учётом локали:
Сам onYearChange не зависит от локали напрямую, но может
быть использован для обновления локализованных данных.
При каждом переключении года событие может вызываться многократно, если пользователь быстро листает календарь:
onYearChange: debounce(function(selectedDates, dateStr, instance) {
loadData(instance.currentYear);
}, 300);
Если внешнее состояние обновляется асинхронно, возможно рассинхронизирование между:
Ошибкой является использование внешних переменных вместо
instance.currentYear, так как:
В SPA-приложениях событие часто используется как триггер для:
onYearChange: function(selectedDates, dateStr, instance) {
const year = instance.currentYear;
history.replaceState(null, "", `?year=${year}`);
}
При каждом вызове onYearChange обновляются:
При этом объект экземпляра остаётся тем же, что позволяет безопасно хранить ссылки на него и использовать в других частях приложения.