В Pikaday большинство методов экземпляра построены по принципу fluent interface, где каждый вызов возвращает ссылку на текущий экземпляр календаря. Это позволяет последовательно выстраивать операции над календарём без промежуточных переменных и повторных обращений к объекту.
Ключевая идея заключается в том, что методы не завершают выполнение
изменением состояния, а возвращают this, сохраняя
возможность продолжить вызовы:
picker
.setDate(new Date())
.gotoToday()
.show();
Такой подход уменьшает количество кода и делает логику управления календарём линейной и предсказуемой.
this в методахБольшая часть методов экземпляра Pikaday возвращает сам объект календаря. Это относится к методам управления датой, отображением и навигацией.
Типичный набор методов, поддерживающих цепочки:
setDate(date)gotoDate(date)gotoToday()gotoMonth(month)gotoYear(year)nextMonth()prevMonth()show()hide()Каждый из них изменяет внутреннее состояние календаря и возвращает текущий экземпляр, позволяя продолжить цепочку вызовов.
Работа с датами часто объединяется в последовательные вызовы, где сначала устанавливается дата, затем выполняется навигация к нужному периоду:
picker
.setDate('2026-06-01')
.gotoMonth(5)
.gotoYear(2026);
В этом примере происходит:
Такая структура делает код декларативным: последовательность вызовов отражает последовательность изменений состояния календаря.
Методы навигации позволяют перемещаться по месяцам и годам без ручного пересчёта дат.
picker
.gotoToday()
.nextMonth()
.nextMonth()
.prevMonth();
Здесь календарь:
Подобные цепочки часто используются в сценариях автоматической прокрутки дат или синхронизации с внешними фильтрами.
Методы отображения календаря также участвуют в цепочках, что позволяет связывать изменение состояния и UI-логику.
picker
.hide()
.setDate(new Date('2026-01-01'))
.show();
В этом случае:
Подобный подход уменьшает количество промежуточных состояний интерфейса и предотвращает визуальные артефакты при обновлении.
Наиболее распространённый сценарий — объединение установки даты и переходов между периодами:
picker
.setDate(new Date())
.gotoMonth(new Date().getMonth())
.gotoYear(new Date().getFullYear())
.show();
Такая конструкция часто используется при инициализации календаря на основе внешних данных или состояния приложения.
Функциональность цепочек основана на том, что методы экземпляра не создают новые объекты, а изменяют текущее состояние и возвращают ссылку на него.
Упрощённая модель поведения метода выглядит следующим образом:
Pikaday.prototype.gotoToday = function () {
this.setDate(new Date());
return this;
};
Это означает:
Такой подход делает API предсказуемым и стабильным при длительных цепочках вызовов.
Несмотря на удобство, цепочки не всегда применимы:
Пример разрыва цепочки:
const date = picker.getDate(); // возвращает Date, цепочка прерывается
picker.setDate(date).show(); // новая цепочка начинается заново
При проектировании цепочек важно соблюдать логическую группировку операций. Последовательность должна отражать реальный сценарий изменения состояния календаря.
Хорошо структурированная цепочка:
picker
.hide()
.setDate('2026-12-31')
.gotoMonth(11)
.gotoYear(2026)
.show();
Такая запись ясно разделяет этапы:
Цепочки Pikaday часто используются как часть более сложной логики интерфейса:
function resetCalendar(picker) {
picker
.hide()
.gotoToday()
.setDate(null)
.show();
}
В этом случае цепочка инкапсулирует сразу несколько операций, упрощая внешний код и уменьшая количество строк в функции.
Цепочки можно выносить в переменные, но важно учитывать, что возвращается тот же объект:
const chain = picker.setDate(new Date());
chain.gotoNextMonth();
chain.gotoYear(2027);
Здесь chain и picker ссылаются на один и
тот же экземпляр, что делает поведение детерминированным, но требует
аккуратности при параллельных изменениях состояния.
При разработке интерфейсов часто используется постепенное расширение цепочки:
picker.setDate(new Date());
picker
.gotoMonth(0)
.gotoYear(2027)
.show();
Разделение на блоки иногда повышает читаемость, особенно при сложной логике инициализации.
Цепочки вызовов в Pikaday формируют единый стиль взаимодействия с календарём:
Этот подход особенно эффективен в UI-коде, где важно минимизировать ветвления и сосредоточиться на последовательности действий над компонентом.