Паттерны
Поле даты с календарём в поповере
Когда использовать:
- Обычное поле формы должно позволять и вводить, и выбирать дату.
- Календарь должен появляться по запросу, а не быть видимым постоянно.
Заметки о композиции:
- Оставьте
DateFieldInputосновной поверхностью и дайте ему подпись. - Смонтируйте
DateFieldCalendarвнутриPopoverContentи используйтеDateFieldTriggerIconButtonсaria-labelв качестве триггера.
Компромиссы:
- Экономит место в раскладке.
- Требует проверки оверлея внутри диалогов, выдвижных панелей и прокручиваемых контейнеров.
import {
CalendarContent,
CalendarDay,
CalendarDays,
CalendarHeader,
CalendarMonth,
CalendarMonthLabel,
CalendarMonths,
CalendarNextButton,
CalendarPrevButton,
CalendarViewButton,
CalendarViewButtonGroup,Поле даты в формах с насыщенной валидацией
Когда использовать:
- Дата должна участвовать в валидации при отправке.
- Тексты ошибок и подсказок важнее визуального просмотра календаря.
Заметки о композиции:
- Используйте нативные
requiredиpatternнаDateFieldInputдля проверки наличия и полноты;minиmaxуже соблюдаются при вводе. disabledDatesсоблюдается только в календаре, поэтому повторите это правило в валидации при отправке.- Показывайте ошибку через
errorна корне иHelperText error, связанный черезaria-describedby.
Компромиссы:
- Нативная валидация ограничений без дополнительных библиотек.
nameна input отправляет введённый текст; чтобы отправить ISO-день, копируйтеonChangeValueв скрытый input, как в разделе Форма/интеграция.
import { FormEvent, useState } from 'react';
import {
Button,
CalendarContent,
CalendarDay,
CalendarDays,
CalendarHeader,
CalendarMonth,
CalendarMonthLabel,
CalendarMonths,
CalendarNextButton,
CalendarPrevButton,Поле даты в модальных сценариях
Когда использовать:
- Сценарии планирования или проверки находятся внутри
Dialog,DrawerилиSheet. - Календарь по-прежнему должен открываться по запросу.
Заметки о композиции:
- Проверьте фокус, закрытие и наложение слоёв вместе с родительским оверлеем.
- Календарь должен быть достаточно компактным для родительского контейнера.
Компромиссы:
- Сохраняет существующий модальный сценарий.
- Усложняет координацию оверлеев.
import { CSSProperties } from 'react';
import { XIcon } from '@vega-ui/icons';
import {
Button,
CalendarContent,
CalendarDay,
CalendarDays,
CalendarHeader,
CalendarMonth,
CalendarMonthLabel,
CalendarMonths,
CalendarNextButton,Поле даты в негригорианском календаре
Когда использовать:
- Пользователи вводят и читают даты в персидском, еврейском, японском, буддийском, исламском или другом календаре.
Заметки о композиции:
- Создайте календарь один раз с помощью
createCalendarSystemвне компонента (см. Даты и календарные системы) и передайте его в пропcalendarкорня вместе сlocale. - Ввод проверяется в этом календаре, например 31-й день 6-го персидского месяца или 13-й еврейский месяц;
minиmaxостаются ISO-строкамиYYYY-MM-DD.
Компромиссы:
- Нативная длина месяцев и високосные месяцы без изменения хранимого значения.
- Длина месяцев и эры берутся из данных
Intlсреды выполнения.
import { useState } from 'react';
import { createCalendarSystem } from '@vega-ui/i18n';
import {
CalendarContent,
CalendarDay,
CalendarDays,
CalendarHeader,
CalendarMonth,
CalendarMonthLabel,
CalendarMonths,
CalendarNextButton,
CalendarPrevButton,Сравнение
Быстрое правило выбора
Используйте DateField, когда значение — одна календарная дата, и пользователи должны иметь возможность ввести её, выбрать или и то и другое.
DateField или DateRangeField
Используйте DateField, когда хранится одна дата.
Используйте DateRangeField, когда начальная и конечная даты должны оставаться связанными в одном элементе управления.
Главный компромисс: DateField проще подписать и провалидировать, а DateRangeField уменьшает ошибки согласования двух связанных значений.
DateField или DateTimeField
Используйте DateField, когда время не важно для хранимого значения.
Используйте DateTimeField, когда итоговое значение определяют дата и время вместе.
Главный компромисс: DateField проще вводить и проверять, а DateTimeField фиксирует полную временну́ю метку.
DateField или Calendar
Используйте DateField, когда пользователям нужен ввод с клавиатуры и поле в духе формы.
Используйте Calendar, когда интерфейс в первую очередь про визуальный выбор даты без ввода текста в поле.
Главный компромисс: DateField лучше вписывается в формы, а Calendar сильнее при постоянно видимом выборе даты.
Выбирайте этот компонент, когда
- Значение — одна дата.
- Пользователи могут вводить дату напрямую.
- Элемент управления находится в строке формы или в панели настроек.
- Календарь — необязательная поддержка, а не вся модель взаимодействия.
Не выбирайте этот компонент, когда
- Функции нужна пара из начальной и конечной даты.
- Хранимое значение должно включать время.
- Интерфейс должен показывать полностью видимый календарь вместо поля ввода.
Решение проблем
Кнопка календаря ничего не открывает
Симптом
Иконка-кнопка триггера рендерится, но по клику календарь не появляется.
Вероятная причина
DateFieldTriggerIconButton отрендерен без окружающего Popover или без DateFieldCalendar внутри оверлея.
Как проверить
- Проверьте, обёрнут ли триггер в
PopoverTrigger. - Проверьте, содержит ли
PopoverContentкомпонентDateFieldCalendar.
Исправление
Скомпонуйте триггер и календарь через Popover внутри DateField.
import {
CalendarContent,
CalendarDay,
CalendarDays,
CalendarHeader,
CalendarMonth,
CalendarMonthLabel,
CalendarMonths,
CalendarNextButton,
CalendarPrevButton,
CalendarViewButton,
CalendarViewButtonGroup,Введённое значение выглядит неправильно
Симптом
Формат, который видят пользователи, не совпадает с поведением разбора.
Вероятная причина
format или separator не совпадает с форматом даты в подписях, подсказках и сообщениях валидации.
Как проверить
- Сравните заданный
formatс видимой подсказкой формы. - Введите типичное значение и проверьте, как оно интерпретируется.
Исправление
Согласуйте видимые подсказки, правила разбора и тексты валидации вокруг одного и того же формата.
Отправляемое значение — не ISO-дата
Симптом
Форма отправляет 15.01.2026 вместо 2026-01-15.
Вероятная причина
DateFieldInput — нативный input, и с name отправляется введённый в него текст.
Как проверить
- Прочитайте поле из
FormDataв обработчике отправки.
Исправление
Берите ISO-день из onChangeValue на корне, а не текст. Чтобы отправить его с формой, уберите name у input и задайте его скрытому input с этим днём, как в разделе Форма/интеграция.
Отключённые даты всё ещё можно ввести
Симптом
Календарь блокирует некоторые дни, но если ввести один из них вручную, он принимается и отправляется.
Вероятная причина
min и max ограничивают введённые даты, но disabledDates действует только на календарь.
Как проверить
- Введите отключённый день и отправьте форму.
Исправление
Проверяйте то же правило disabledDates в валидации при отправке и на сервере.