логотип PurpleSchool
логотип PurpleSchool

Использование компонентов datepicker в Vue для выбора дат

Автор

Олег Марков

Введение

В современных веб-приложениях вам часто требуется предоставить пользователям удобный и красивый способ выбора дат — будь то календарь отпуска, бронирование мероприятия или обычная форма фильтрации по времени. Для этих целей в Vue-разработке активно применяются компоненты datepicker (выбор даты). Они позволяют организовать выбор одной или нескольких дат, времени, диапазонов, а также предоставляют расширенную кастомизацию без необходимости писать сложную логику вручную.

В данной статье вы познакомитесь с популярными компонентами datepicker для Vue, узнаете, как добавить их в проект, какие параметры они поддерживают, как реагировать на пользовательские действия и интегрировать с формами. Вас ждут подробные примеры кода с пояснениями, обзоры возможностей кастомизации, вопросы интернационализации и советы по решению типовых проблем.


Зачем использовать datepicker в Vue

Выбор дат может выглядеть тривиальной задачей, но на практике ручная реализация приводит к множеству ошибок. Типовые трудности:

  • Валидация дат, входящих в определённый диапазон
  • Работа с интернационализацией и локалью (месяцы, первый день недели, формат даты)
  • Выбор диапазона дат
  • Интеграция с формами и моделями данных
  • Адаптация к мобильным устройствам и разметке

Использование готового компонента datepicker позволяет:

  • Быстро внедрить надёжный UX с календарём
  • Гибко настроить стили и поведение без написания сложной логики
  • Интернационализировать ваш календарь под нужную аудиторию
  • Экономить время и повышать надёжность обработки даты

Популярные компоненты datepicker для Vue

Обзор наиболее востребованных решений

Vue3-Datepicker

  • Подходит для Vue 3
  • Прост в использовании, поддерживает всю базовую функциональность: выбор дат, диапазоны, валидация, кастомизация
  • Лёгкая поддержка локализации и стилей

Vuetify Date Picker

  • Часть популярного Material Design-фреймворка Vuetify
  • Отлично интегрируется с экосистемой Vuetify
  • Поддерживает выбор дат, времени и диапазонов
  • Имеет множество параметров кастомизации

Element Plus DatePicker

  • Используется в составе UI-библиотеки Element Plus для Vue 3
  • Варианты выбора: одна дата, период, время, месяц, год
  • Легко внедряется в формы Element Plus

Vuejs-datepicker (подходит для Vue 2)

  • Лёгкий компонент
  • Легко подключается в независимые проекты

Рассмотрим практические примеры внедрения и настройки на самом популярном на сегодня Vue3-Datepicker (но под конец коротко сравним подход в других популярных библиотеках).


Установка и интеграция Vue3-Datepicker

Установка

Для начала покажу, как добавить компонент в проект Vue 3.

npm install vue3-datepicker

Подключение к компоненту

Для локального использования в файле вашего компонента:

<script setup>
import Datepicker from 'vue3-datepicker'
import { ref } from 'vue'

const selectedDate = ref(null)
</script>

<template>
  <Datepicker v-model="selectedDate" />
</template>

// Здесь мы импортируем компонент, создаём реактивное состояние selectedDate и связываем его с компонентом датапикера через v-model. Каждый раз, когда пользователь выбирает дату, переменная selectedDate обновляется.


Основные параметры и кастомизация

Ограничение доступных дат

Многие приложения требуют ограничивать, какие даты доступны пользователю (например, чтобы запретить выбор прошедших дат).

<Datepicker 
  v-model="selectedDate" 
  :min-date="new Date()" // Только сегодняшнее число и позднее
/>

// min-date и max-date позволяют ограничить диапазон выбора дат.

Выбор диапазона дат (range selection)

Если вы делаете интерфейс для бронирования или отпуска — удобно дать выбрать сразу от и до.

<script setup>
import Datepicker from 'vue3-datepicker'
import { ref } from 'vue'

const range = ref([])
</script>

<template>
  <Datepicker v-model="range" range />
</template>

// Благодаря параметру range теперь можно выбирать диапазон дат. В массиве range первое значение — начало диапазона, второе — окончание.

Формат отображения и локализация

Компонент поддерживает настройку отображения (например, день-месяц-год или месяц-день-год), а также локализацию названий месяцев и дней недели.

<script setup>
import Datepicker from 'vue3-datepicker'
import { ru } from 'date-fns/locale' // Импортируем русскую локаль
import { ref } from 'vue'

const selectedDate = ref(null)
</script>

<template>
  <Datepicker
    v-model="selectedDate"
    :format="date => date.toLocaleDateString('ru-RU')"
    :locale="ru"
  />
</template>

// Здесь мы задаём кастомную функцию форматирования и указываем русскую локаль, чтобы интерфейс был на русском.

Масштабирование и внешний вид

Вы можете стилизовать datepicker через слоты CSS или даже передать свои шаблоны для кнопок, дней и других элементов.

<Datepicker
  v-model="selectedDate"
  dropdown-class="my-dropdown-style"
  input-class="my-input-style"
/>

// dropdown-class и input-class — способы передать классы для стилизации выпадающего календаря и самого поля ввода.


Обработка событий и взаимодействие с формами

Компонент datepicker реагирует на пользовательские действия и предоставляет события:

  • @update:model-value — вызывается при изменении выбранной даты
  • @open — при открытии календаря
  • @close — при закрытии

Пример использования событий

<Datepicker
  v-model="selectedDate"
  @update:model-value="onDateChange"
  @open="onOpen"
  @close="onClose"
/>
<script setup>
function onDateChange(date) {
  // Выполняйте тут нужную логику (например, отправку или валидацию)
  console.log(`Выбрана дата: ${date}`)
}

function onOpen() {
  // Реакция на открытие календаря
  console.log('Календарь открыт')
}

function onClose() {
  // Реакция на закрытие календаря
  console.log('Календарь закрыт')
}
</script>

Интеграция с формами (на примере Vee-Validate)

Если вы хотите использовать datepicker как часть формы с валидацией:

<template>
  <Form @submit="onSubmit">
    <Field name="birthday" rules="required" v-slot="{ field, meta, errors }">
      <Datepicker v-model="field.value" />
      <span v-if="errors.length">{{ errors[0] }}</span>
    </Field>
    <button type="submit">Сохранить</button>
  </Form>
</template>

// Здесь мы используем Vee-Validate для валидации поля с датой, ошибок и обработки формы.


Дополнительные возможности и полезные параметры

Выбор времени (datetime picker)

Многие datepickers поддерживают выбор времени. В Vue3-Datepicker этого нет “из коробки”, но во Vue ecosystem есть компоненты типа vue3-timepicker, либо используйте Element Plus/Vuetify.

Пример для Element Plus:

<el-date-picker
  v-model="datetime"
  type="datetime"
  placeholder="Выберите дату и время"
/>

Отключение дней/выделение определённых дат

Некоторые datepicker поддерживают функцию disableDate:

<Datepicker
  v-model="selectedDate"
  :disabled-date="isWeekend"
/>
<script setup>
function isWeekend(date) {
  // Отключать выходные (суббота, воскресенье)
  const day = date.getDay()
  return day === 0 || day === 6
}
</script>

Кастомные слоты

Более сложные UI часто требуют вставить свою кнопку today, кастомное сообщение или иконку. Многие компоненты реализуют слоты, например:

<Datepicker>
  <template #icon>
    <svg>...</svg> <!-- Ваша SVG-иконка -->
  </template>
</Datepicker>

Сравнение с другими компонентами на примере Vuetify

Если ваш проект использует Vuetify, способ внедрения чуть отличается.

<template>
  <v-date-picker v-model="date" :min="new Date()" :max="nextYear" show-adjacent-months />
</template>
<script setup>
import { ref } from 'vue'

const date = ref(null)
const nextYear = new Date(new Date().getFullYear() + 1, 11, 31)
</script>

Vuetify предоставляет огромный список опций: выбор типа (date, month, year), support разных тем, интеграция с v-text-field и v-form.


Советы и лучшие практики

  • Проверяйте, что выбранная дата сохраняется в нужном формате. Очень часто дата сохраняется как объект Date, но серверу может требоваться ISO-строка.
  • Если вы используете SSR (Nuxt), проверяйте, что component поддерживает SSR или загружайте его только на клиенте через dynamic import.
  • Для локализации всегда используйте внешний пакет локалей (например, date-fns/locale или moment.js), а не пишите свои массивы месяцев и дней недели.
  • Не забывайте про доступность и навигацию с клавиатуры — особенно если у вас корпоративное или сложное приложение.
  • Тестируйте работу на мобильных устройствах — иногда поведение в touch-интерфейсах иное.

Заключение

Компоненты datepicker существенно упрощают работу с датами в интерфейсах на Vue. С их помощью вы быстро внедрите выбор даты, диапазона или времени с валидацией, поддержкой локализации и кастомизации под дизайн вашего приложения. На рынке есть множество решений как для “чистого” Vue (Vue3-Datepicker), так и для крупных UI-библиотек (Element Plus, Vuetify). Грамотный выбор datepicker и правильная интеграция позволят вам повысить удобство и надёжность работы с датами в проекте, снизить количество ошибок, а также облегчить дальнейшее сопровождение кода.


Частозадаваемые технические вопросы по теме и ответы

Как задать начальную выбранную дату в datepicker?

Чтобы сразу установить выбранное значение, присвойте нужную дату переменной, связанной через v-model. Например: js const selectedDate = ref(new Date('2024-07-01'))

Как передать выбранную дату на сервер в виде строки?

Используйте метод toISOString() для объекта Date: js const isoDate = selectedDate.value.toISOString() Это позволит отправить дату в формате YYYY-MM-DDTHH:mm:ss.sssZ.

Можно ли сделать выбор сразу нескольких дат не подряд (multi-date)?

Многие компоненты поддерживают только range. Но некоторые (например, Element Plus) позволяют multi-selection: html <el-date-picker v-model="dates" type="dates" /> Где dates — массив дат.

Как сгенерировать массив дат между двумя датами из диапазона?

Для создания массива дней воспользуйтесь простым скриптом: js function getDatesInRange(start, end) { const dates = [] let current = new Date(start) while (current <= end) { dates.push(new Date(current)) current.setDate(current.getDate() + 1) } return dates }

Как реализовать динамическое ограничение min/max дат по событиям?

Сделайте min-date и max-date реактивными переменными: js const minDate = ref(new Date()) const maxDate = computed(() => new Date(minDate.value.getFullYear(), minDate.value.getMonth() + 1, 0)) <Datepicker :min-date="minDate" :max-date="maxDate" /> Теперь диапазон будет меняться по нужной вам логике.

Стрелочка влевоИспользование директив и их особенности на Vue с помощью defineОрганизация циклов и итераций во VueСтрелочка вправо

Все гайды по Vue

Руководство по валидации форм во Vue.jsИнтеграция Tiptap для создания редакторов на VueРабота с таблицами во Vue через TanStackИнструкция по установке и компонентам Vue sliderУправление пакетами Vue js с помощью npmУправление пакетами и node modules в Vue проектахКак использовать meta для улучшения SEO на VueПолный гайд по компоненту messages во Vuejs5 правил использования Inertia с Vue и LaravelРабота с модулями и пакетами в VueИнструкция по работе с grid на VueGithub для Vue проектов - подробная инструкция по хранению и совместной работеНастройка ESLint для Vue проектов и поддержка качества кодаОбработка ошибок и отладка в Vue.jsИспользование Vue Devtools для отладки и мониторинга приложенийРабота с конфигурационными файлами и скриптами VueСоздание и настройка проектов Vue с помощью Vue CLI3 способа интеграции Chart.js с Vue для создания графиковРабота с Canvas во VueИнструкция по реализации календаря во VueРабота с Ant Design Vue для создания UI на Vue
Обзор и использование утилит Vue для удобной разработкиРабота с обновлениями компонента и жизненным циклом updateРазрешение конфликтов и ошибок с помощью Vue resolveИспользование query-параметров и их обработка в маршрутах VueЗагрузка и управление состоянием загрузки в VueИспользование библиотек Vue для расширения функционалаРабота с JSON данными в приложениях VueКак работать с экземплярами компонента Instance во VueПолучение данных и API-запросы во Vue.jsЭкспорт и импорт данных и компонентов в VueОбработка событий и их передача между компонентами VuejsПонимание core функционала Vue и его применениеГайд по defineEmits на Vue 3Понимание и применение Composition API в Vue 3Понимание и работа с компилятором VueКогда и как использовать $emit и call во VueВзаимодействие с внешними API через Axios в Vue
Веб приложения на Vue архитектура и лучшие практикиИспользование Vite для быстрого старта и сборки проектов на Vue 3Работа с URL и ссылками в приложениях на VueРабота с пользовательскими интерфейсами и UI библиотеками во VueОрганизация и структура исходных файлов в проектах VueИспользование Quasar Framework для разработки на Vue с готовыми UI-компонентамиОбзор популярных шаблонов и стартовых проектов на VueИнтеграция Vue с PHP для создания динамичных веб-приложенийКак организовать страницы и маршруты в проекте на VueNuxt JS и Vue 3 для SSR приложенийСоздание серверных приложений на Vue с помощью Nuxt jsИспользование Vue Native для разработки мобильных приложенийОрганизация и управление индексной страницей в проектах VueИспользование Docker для контейнеризации приложений на VueИнтеграция Vue.js с Django для создания полноценных веб-приложенийСоздание и работа с дистрибутивом build dist Vue приложенийРабота со стилями и CSS в Vue js для красивых интерфейсовСоздание и структурирование Vue.js приложенияКак исправить ошибку cannot find module vueНастройка и сборка проектов Vue с использованием современных инструментовИнтеграция Vue с Bitrix для корпоративных решенийРазработка административных панелей на Vue js
5 библиотек для создания tree view во VueИнтеграция Tailwind CSS с Vue для современных интерфейсовИнтеграция Vue с серверной частью и HTTPS настройкамиКак обрабатывать async операции с Promise во VueИнтеграция Node.js и Vue.js для разработки приложенийРуководство по интеграции Vue js в NET проектыПримеры использования JSX во VueГайд по импорту и регистрации компонентов на VueМногоязычные приложения на Vue с i18nИнтеграция FLIR данных с Vue5 примеров использования filter во Vue для упрощения разработки3 примера реализации drag-and-drop во Vue
Управление переменными и реактивными свойствами во VueИспользование v for и slot в VueПрименение v-bind для динамической привязки атрибутов в VueУправление пользователями и их данными в Vue приложенияхСоздание и использование UI Kit для Vue приложенийТипизация и использование TypeScript в VuejsИспользование шаблонов в Vue js для построения интерфейсовИспользование Swiper для создания слайдеров в VueРабота со стилями и стилизацией в VueСтруктура и особенности Single File Components SFC в VueРабота со SCSS в проектах на Vue для стилизацииРабота со скроллингом и прокруткой в Vue приложенияхПрименение script setup синтаксиса в Vue 3 для упрощения компонентовИспользование scoped стилей для изоляции CSS в компонентах Vue3 способа улучшить навигацию Vue с push()Обработка запросов и асинхронных операций в VueПонимание и использование provide inject для передачи данных между компонентамиПередача и использование props в Vue 3 для взаимодействия компонентовПередача данных между компонентами с помощью props в Vue jsУправление property и функциями во Vue.jsРабота со свойствами компонентов VueУправление параметрами и динамическими данными во VueРабота с lifecycle-хуком onMounted во VueОсновы работы с объектами в VueПонимание жизненного цикла компонента Vue js на примере mountedИспользование модальных окон modal в Vue приложенияхИспользование методов в компонентах Vue для обработки логикиИспользование метода map в Vue для обработки массивовИспользование хуков жизненного цикла Vue для управления состоянием компонентаРабота с ключами key в списках и компонентах VueОбработка пользовательского ввода в Vue.jsРабота с изображениями и их оптимизация в VueИспользование хуков жизненного цикла в VueОрганизация сеток и гридов для верстки интерфейсов на VueСоздание и управление формами в VueОрганизация файлов и структура проекта Vue.jsКомпоненты Vue создание передача данных события и emitРабота с динамическими компонентами и данными в Vue3 способа манипулирования DOM на VueРуководство по div во VueИспользование директив в Vue и их расширенные возможностиОсновы и применение директив в VueИспользование директив и их особенности на Vue с помощью defineИспользование компонентов datepicker в Vue для выбора датОрганизация циклов и итераций во VueКак работает компиляция Vue CoreСоздание и использование компонентов в Vue JSОбработка кликов и пользовательских событий в VueИспользование классов в Vue для организации кода и компонентовИспользование директивы checked для управления состоянием чекбоксов в VueГайд на checkbox компонент во VueОтображение данных в виде графиков с помощью Vue ChartСоздание и настройка кнопок в VueСоздание и настройка кнопок в Vue приложенияхРабота с lifecycle-хуками beforeCreate и beforeMount во VueИспользование массивов и методов их обработки в VueИспользование массивов и их обработка в Vue
Использование Vuetify для создания современных интерфейсов на VueИспользование transition во VueТестирование компонентов и приложений на VueРабота с teleport для управления DOM во VueПять шагов по настройке SSR в VuejsИспользование Shadcn UI компонентов с Vue для продвинутых интерфейсовИспользование router-link для навигации в Vue RouterКак использовать require в Vue для динамического импорта модулейРабота с динамическим рендерингом и виртуальным DOM на Vue.jsИспользование ref для управления ссылками и реактивностью в Vue 3Использование Vue Pro и его преимущества для профессиональной разработкиРуководство по nextTick для работы с DOMСоздание и использование компонентов с помощью Vue js и CУправление состоянием и реактивностью через inject и provideДинамическое обновление компонентов и данных на VueГлубокое изучение документации Vue и как эффективно её использоватьИспользование Crystal с Vue для разработкиИспользование вычисляемых свойств для динамического отображения данных на Vue jsОптимизация производительности и предупреждения в Vue
Открыть базу знаний