Метод nextMonth

Метод nextMonth в библиотеке Pikaday предназначен для программного переключения календарного представления на следующий месяц относительно текущего состояния календаря. Он изменяет внутреннюю дату просмотра (view date), сохраняя при этом выбранное значение даты (если оно задано пользователем), и обновляет интерфейс календаря без необходимости ручного пересчёта месяца и года.


Изменение состояния календаря

Внутри Pikaday календарь оперирует понятием текущей отображаемой даты, которая не всегда совпадает с выбранной датой. Эта дата используется исключительно для рендеринга сетки календаря.

При вызове nextMonth происходит:

  • увеличение месяца на 1;
  • автоматический переход на следующий год при переполнении (декабрь → январь);
  • перерасчёт внутренних значений month и year;
  • перерисовка календарной сетки.

Ключевой момент заключается в том, что метод работает именно с view state, а не с selected date, что позволяет пользователю перемещаться по календарю, не изменяя выбор.


Сигнатура и возвращаемое значение

Метод вызывается без параметров:

picker.nextMonth();

Возвращаемое значение — экземпляр Pikaday, что позволяет выстраивать цепочки вызовов:

picker.nextMonth().nextMonth();

Такой подход используется в API библиотеки для упрощения последовательных операций над состоянием календаря.


Влияние на внутренние поля экземпляра

После вызова nextMonth изменяются следующие внутренние значения:

  • currentMonth — увеличивается на 1, либо сбрасывается в 0 при переходе через декабрь;
  • currentYear — увеличивается на 1 при переполнении месяца;
  • draw() или аналогичный внутренний метод рендера вызывается автоматически;
  • isVisible остаётся неизменным, календарь не закрывается.

Выбранная дата (selectedDate) остаётся нетронутой, если она была установлена ранее через setDate.


Работа с границами minDate и maxDate

Если в конфигурации Pikaday заданы ограничения:

minDate: new Date(2024, 0, 1),
maxDate: new Date(2025, 11, 31)

метод nextMonth учитывает эти границы при переключении:

  • переход в месяц, полностью выходящий за maxDate, блокируется;
  • если следующий месяц частично выходит за диапазон, часть дней становится недоступной;
  • навигация может быть визуально ограничена, но вызов метода при этом не вызывает ошибок.

Таким образом, nextMonth является безопасной операцией даже в условиях жёстко заданных диапазонов дат.


Поведение интерфейса после вызова

После выполнения метода календарь полностью обновляет отображаемую сетку:

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

Если подключены пользовательские рендер-функции или кастомные шаблоны, они также повторно применяются к новому состоянию.


Взаимодействие с навигацией пользователя

Метод nextMonth эквивалентен действию пользователя, который нажимает кнопку перехода вперёд по месяцам в интерфейсе календаря. Встроенные обработчики Pikaday используют ту же внутреннюю логику.

При программном вызове:

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

Цепочки навигации и повторные вызовы

Многократные вызовы метода приводят к последовательному смещению календаря:

picker.nextMonth(); // +1 месяц
picker.nextMonth(); // ещё +1 месяц
picker.nextMonth(); // ещё +1 месяц

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

При использовании цепочки:

picker.nextMonth().nextMonth();

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


Сравнение с gotoMonth

Внутренне nextMonth опирается на ту же механику, что и gotoMonth, но с фиксированным инкрементом:

  • gotoMonth(n) устанавливает конкретный номер месяца;
  • nextMonth() всегда увеличивает текущий месяц на 1.

Фактически, логика nextMonth может быть представлена как:

picker.gotoMonth(currentMonth + 1);

Однако в реальной реализации добавляется обработка переполнения года и проверка ограничений диапазона дат.


Особенности работы с переходом декабрь → январь

При достижении декабря (month = 11) и вызове nextMonth происходит:

  • сброс месяца в 0;
  • увеличение года на 1;
  • полная перестройка календарной сетки под новый год.

Этот переход не требует дополнительных условий со стороны пользователя и полностью управляется внутренней логикой Pikaday.


Использование в программной навигации

Метод часто применяется в сценариях, где требуется автоматическое пролистывание календаря:

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

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


Взаимодействие с отрисовкой и перерисовкой

Каждый вызов nextMonth приводит к полной перерисовке календаря. Это включает:

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

Производительность операции остаётся стабильной, так как обновляется только текущий видимый месяц без перестроения всего компонента.


Поведение при скрытом календаре

Если календарь скрыт (isVisible = false), вызов nextMonth:

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

Таким образом, можно предварительно «переместить» календарь вперёд до его отображения.


Связь с состоянием выбранной даты

Если выбранная дата находится вне текущего отображаемого месяца, вызов nextMonth может привести к следующим визуальным эффектам:

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

Это подчёркивает разделение между состоянием выбора и состоянием отображения.


Поведение при кастомных конфигурациях

При использовании нестандартных настроек:

  • firstDay — влияет только на разметку недели, не затрагивает навигацию;
  • bound — может дополнительно ограничивать переходы;
  • disableDayFn — влияет на доступность дат, но не на смену месяца.

nextMonth остаётся детерминированной операцией изменения view state независимо от конфигурации рендера.