Гид по технологиям

Как добавить выбор даты в React.js приложение

6 min read Frontend Обновлено 09 Jan 2026
Выбор даты в React.js — способы и примеры
Выбор даты в React.js — способы и примеры

Приложение с элементами выбора даты в React

Добавление элемента выбора даты (date picker) в ваше React.js приложение делает интерфейс понятнее и сокращает число ошибок при вводе дат. Вместо ручного ввода пользователь выбирает дату в календаре — быстрее и надежнее. Варианты реализации: нативный HTML5, сторонние библиотеки или собственная реализация на основе компонентов.

Что такое выбор даты

Выбор даты — это элемент интерфейса, который позволяет пользователю выбрать дату в календаре. Обычно это текстовое поле с иконкой календаря: клик открывает всплывающий календарь. В зависимости от настроек пользователь может вводить дату вручную или выбирать её из визуального календаря.

Краткое определение: элемент для выбора даты и (опционально) времени с визуальным календарём.

Как добавить выбор даты в React.js

Ниже — несколько распространённых подходов с примерами кода, плюс рекомендации по UX, доступности и тестированию.

Встроенные возможности HTML5

Преимущество нативного подхода — минимум зависимостей и простота. Недостатки — различия в рендеринге между браузерами и слабая настраиваемость.

import React, { useRef, useState } from 'react';

const DatePicker = () => {
  const [date, setDate] = useState('');
  const dateInputRef = useRef(null);

  const handleChange = (e) => {
    setDate(e.target.value);
  };

  return (
    

Selected Date: {date}

); }; export default DatePicker;

Это простая реализация: HTML5 input type=”date” открывает нативный выбор даты. Формат и внешний вид зависят от браузера и локали пользователя.

React-приложение с выбором даты на основе встроенного input

Ограничения нативного подхода

  • Разный UI в разных браузерах и ОС (desktop vs mobile).
  • Ограниченные возможности кастомизации стилей.
  • Сложно реализовать продвинутые сценарии: выбор диапазона, кнопки «очистить», кастомные форматы.

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

react-datepicker: популярный и гибкий

react-datepicker — широко используемая библиотека с поддержкой диапазонов, кастомных рендеров и локализации.

import React, { useState } from 'react';
import DatePicker from 'react-datepicker';
import 'react-datepicker/dist/react-datepicker.css';

const DatePickerExample = () => {
  const [startDate, setStartDate] = useState(new Date());

  return (
     setStartDate(date)}
    />
  );
};

export default DatePickerExample;

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

React-приложение с выбором даты используя react-datepicker

react-date-picker: другой подход и стиль

react-date-picker — ещё одна популярная библиотека. Её отличия в API и стилях; она бывает удобна, если нужна более «готовая» визуальная часть без дополнительной кастомизации.

import React, { useState } from 'react';
import DatePicker from 'react-date-picker';

const DatePickerExample = () => {
  const [startDate, setStartDate] = useState(new Date());

  return (
     setStartDate(date)}
    />
  );
};

export default DatePickerExample;

Плюсы: простой API, готовый внешний вид. Минусы: отличия в возможностях по сравнению с react-datepicker, возможны конфликты стилей.

React-приложение с выбором даты используя react-date-picker

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

Типичные расширения для выбора даты:

  • Диапазоны дат (start/end).
  • Выбор времени (date & time).
  • Блокировка дат (min/max, исключить праздники).
  • Кастомный формат отображения и парсинга.
  • Валидация и сообщения об ошибках.
  • Международные форматы (локализация) и учёт временных зон.

Пример выбора диапазона с react-date-picker (два компoнента):

import React, { useState } from 'react';
import DatePicker from 'react-date-picker';

const DatePickerRange = () => {
  const [startDate, setStartDate] = useState(new Date());
  const [endDate, setEndDate] = useState(new Date());

  return (
    
setStartDate(date)} /> setEndDate(date)} />
); }; export default DatePickerRange;

Валидация и сообщения об ошибках

Рекомендуется валидировать даты как на клиенте, так и на сервере:

  • Проверять диапазоны (min/max).
  • Проверять порядок дат (start <= end).
  • Парсить форматы строго и показывать понятное сообщение.

Пример простого валидатора:

const validateRange = (start, end) => {
  if (!start || !end) return { valid: false, message: 'Выберите обе даты.' };
  if (start > end) return { valid: false, message: 'Дата начала больше даты окончания.' };
  return { valid: true };
};

Доступность (A11y)

Важно, чтобы date picker был доступен для пользователей с клавиатурой и экранными читалками:

  • Поле должно иметь связанный label (for / aria-labelledby).
  • Кнопки должны быть фокусируемыми и управляться клавишами (Enter, Esc, стрелки).
  • Для сложных календарей добавьте роли ARIA (grid, gridcell) и состояния (aria-selected).
  • Сделайте читаемые текстовые ошибки и подсказки для экранных читалок.

Пример простой разметки с label:



Формат: ГГГГ‑ММ‑ДД

Локализация и временные зоны

Локаль влияет на формат даты и первый день недели. Библиотеки обычно поддерживают локали (например, date-fns, moment, Intl). При выборе локали учитывайте:

  • Формат отображения даты для пользователя.
  • Формат, в котором отправляете дату на сервер (стандарт ISO 8601 рекомендуется).
  • Временные зоны: храните даты в UTC на сервере и отображайте в локальной TZ клиента.

Совет: храните время в ISO (UTC) и форматируйте под локаль клиента при рендере.

Когда встроенный выбор даты не подходит (контрпримеры)

  • Нужен единообразный внешний вид во всех браузерах — нативный input не подойдёт.
  • Нужно выбрать диапазон с визуальным выделением рабочего времени — лучше библиотека.
  • Необходима поддержка кастомных праздников и отключаемых дат — требует расширенного API.

В этих случаях сторонние компоненты или своя реализация предпочтительнее.

Альтернативные подходы и библиотеки

  • react-day-picker — модульный и сильно кастомизируемый.
  • flatpickr + react-flatpickr — лёгкий и быстрый, много плагинов.
  • Chakra UI, Material UI — если вы используете UI-фреймворк, рассмотрите их компоненты выбора даты.

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

Интеграция с формами

Популярные форм-менеджеры: Formik и React Hook Form. Пример интеграции с React Hook Form:

import { useForm, Controller } from 'react-hook-form';
import DatePicker from 'react-datepicker';

const MyForm = () => {
  const { control, handleSubmit } = useForm();

  const onSubmit = data => console.log(data);

  return (
    
( )} /> ); };

Критерии приёмки

  • Пользователь может выбрать дату с клавиатуры и мышью.
  • Формат даты соответствует локали пользователя или ясно указан.
  • Ошибки валидации отображаются корректно и доступны для экранных читалок.
  • Даты отправляются в стандарте ISO 8601 на сервер.
  • При выборе диапазона start <= end.

Чек‑лист ролей

Разработчик:

  • Подключил тесты на валидацию.
  • Обработал крайние случаи (min/max, пустые значения).
  • Учёл локали и TZ.

Дизайнер:

  • Уточнил поведение при фокусе и ошибках.
  • Предоставил состояния (hover, active, disabled).

QA:

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

Тесты и приёмочные сценарии

  • Выбрать дату вручную и проверить формат отправки.
  • Выбрать диапазон и проверить порядок дат.
  • Попытка выбрать дату вне допустимого диапазона должна показать ошибку.
  • Проверить поведение при отключённых JS (если критично).

Миграция и совместимость

  • При переходе с нативного input на библиотеку учтите: формат данных и обработчики onChange могут отличаться (строка vs Date).
  • Обновления библиотек могут изменять API; фиксируйте версии в package.json.

Безопасность и приватность

Даты обычно не являются чувствительными данными, но учитывайте:

  • Не логируйте лишние личные метаданные вместе с датами.
  • При аналитике анонимизируйте привязки к пользователям по необходимости.

Мини‑методология выбора решения

  1. Определите требования: единообразие UI, диапазоны, время, локализация.
  2. Попробуйте нативный input для простых задач.
  3. Если требуется единообразие и расширенные функции — протестируйте 2–3 библиотеки.
  4. Оцените bundle size, доступность и простоту интеграции.
  5. Внедрите тесты и критерии приёмки.

Краткая сводка ключевых рекомендаций

  • Для простых форм — input type=”date”.
  • Для единого UI и расширенных сценариев — react-datepicker или react-date-picker.
  • Всегда валидируйте даты и храните в ISO/UTC на сервере.
  • Обеспечьте доступность и корректную локализацию.

1‑строчный глоссарий

  • Локаль: набор правил форматирования (например, ru‑RU).
  • ISO 8601: стандарт формата даты/времени (YYYY‑MM‑DDThh:mm:ssZ).
  • TZ: временная зона.

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

Примечание

Если нужно, могу подготовить конкретный пример интеграции date picker с вашим стеком (Formik или React Hook Form), учесть локаль и показать пример кастомной валидации.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство