useCalendar
useForm и useControl - хелперы для работы с формами и валидацией
useCalendar
useCalendar - хук для обобщения рендеринга календаря
Аргументы
month
- type:
number - required:
true
Номер месяца (нумерация начинается с 0 по аналогии с Date API)
year
- type:
number - required:
true
Год для календаря
activeDate
- type:
Date - default:
null
Активная дата для ее выделения в календаре
minDate
- type:
Date - default:
ReturnType<typeof getMinDate>
Минимальная возможная дата. Значением по умолчанию является результат функции getMinDate из utils
maxDate
- type:
Date - default:
ReturnType<typeof getMaxDate>
Максимальная возможная дата. Значением по умолчанию является результат функции getMaxDate из utils
onSelect
- type:
(date: Date) => any - default:
() => {}
Функция для выбора даты из dates
options
- type:
FormOptions<T, Vargs> - default:
{}
interface useCalendarProps {
month: MaybeRef<number>;
year: MaybeRef<number>;
activeDate: MaybeRef<Date | null>;
minDate?: MaybeRef<Date>;
maxDate?: MaybeRef<Date>;
onSelect?: (date: Date) => any;
}
Return
daysCount
- type:
Ref<number>
Кол-во дней в месяце month.
beforeOffset
- type:
Ref<number>
Кол-во дней предыдущего месяца, начиная с понедельника, до 1-го числа
месяца month.
afterOffset
- type:
Ref<number>
Кол-во дней следующего после month месяца до первого воскресенья
startDate
- type:
Ref<Date>
Date, соответствующий первому числу месяца month.
endDate
- type:
Ref<Date>
Date, соответствующий последнему числу месяца month.
weekLabels
- type:
Array<"Вс" | "Пн" | "Вт" | "Ср" | "Чт" | "Пт" | "Сб">
Список коротких наименований дней недели.
dates
- type:
Array<CalendarDate>
Список элементов календаря для обощения рендеринга
interface CalendarDate {
day: number; // номер дня
month: number; // номер месяца
year: number; // год
date: Date; // соответсвующий объект даты
isToday: boolean // является ли текущая дата сегодняшней;
isActive: boolean // равняется ли дата activeDate из props;
isOffCurrentMonth: boolean // принадлежит ли дата текущему месяцу календаря;
isOffLimits: boolean // выходит ли за пределы лимитов maxDate и minDate;
onSelect: () => void; // функция для выбора, вызывающая onSelect из props, если
// дата не isOffCurrentMonth, isActive или isOffLimits
}
<template>
<div class="calendar">
<div class="calendar__labels">
<div
v-for="weekLabel in weekLabels"
:key="weekLabel"
>
{{ weekLabel }}
</div>
</div>
<div
v-for="(dates, i) in datesByWeek"
:key="i"
class="calendar__week"
>
<button
v-for="{ day, isOffCurrentMonth, isOffLimits, isActive, isToday } in dates"
:class="{
'calendar__day_active': isActive,
'calendar__day_today': isToday,
'calendar__day_disabled': isOffLimits || isOffCurrentMonth,
}"
>
{{ isOffCurrentMonth ? '' : day }}
</button>
</div>
</div>
</template>
import Vue from 'vue';
import { computed } from '@vue/composition-api';
import chunk from 'lodash-es/chunk'
import useCalendar from '#sf/composition/calendar/use-calendar';
export default Vue.extend({
setup(props, context) {
const {
dates,
beforeOffset,
afterOffset,
weekLabels
} = useCalendar({
month: 5,
year: 2020
});
const datesByWeek = computed(() => chunk(dates.value, 7));
return {
weekLabels,
datesByWeek
};
},
});