Форма не рендерит поля сама — собирайте их из CdsTextInput, CdsSelect, CdsCheckbox и других контролов. Правила валидации объявляются на самих полях пропом
rules.
Анатомия
Форма — нативный form с необязательной шапкой: заголовок и описание рендерятся над контентом, поля из default-слота остаются как есть. Заголовок связывается с формой через aria-labelledby, описание — через aria-describedby.
Вариации
Заголовок и описание
Свойство label называет форму, description добавляет пояснение под заголовком. Одноимённые слоты принимают произвольную разметку.
Статус валидности
v-model формы — общий статус её полей: null, пока форма не проверялась, false при ошибках и true, когда все поля валидны. Статус обновляется на лету — например, им удобно блокировать кнопку отправки.
Момент валидации
Свойство validate-on задаёт всем полям формы момент запуска проверки; собственный validate-on поля имеет приоритет. Переключите режим и попробуйте: при input (по умолчанию) ошибка появляется по мере ввода, при blur — после ухода из поля, при submit — только при отправке формы.
Быстрая валидация
Свойство first-fail останавливает проверку на первом невалидном поле. Отправьте форму: ошибку покажет только «Имя», хотя «Фамилия» тоже невалидна.
Состояния
disabled блокирует все поля формы разом, readonly оставляет значения видимыми и копируемыми, но запрещает их менять. Отдельные поля настраивать не нужно — состояние наследуется.
Скрытие деталей
Нижним блоком с сообщениями управляет проп hide-details на самих полях: true скрывает блок всегда — вместе с ошибками, false всегда резервирует под него место, auto показывает блок, только когда есть что показать. В плотных формах используйте auto: поля стоят вплотную, но ошибки валидации не теряются. Переключите значение и отправьте пустую форму.
Слоты
Default-слот получает состояние формы и методы управления — кнопки «Проверить» и «Сбросить» собираются без ref на компонент.
| Имя слота | Описание |
|---|---|
label | Содержимое заголовка (замещает label) |
description | Содержимое описания (замещает description) |
default | Контент формы; слот-пропсы: isValid, errors, isValidating, validate, reset, resetValidation |
Рекомендации
Сценарии использования
Отправка формы
Событие submit — это Promise: await event возвращает результат валидации, и обработчик сам решает, отправлять ли данные. Модификатор .prevent отключает нативную отправку страницы. Запрос здесь имитируется setTimeout, кнопка на время «запроса» показывает loading.
Управление извне
Методы validate, reset и resetValidation доступны и через ref на форму. Так управляют формой снаружи — из футера модального окна или панели мастера, где кнопки живут вне разметки формы.
Vee-validate
Форма дружит с внешними библиотеками валидации. С vee-validate схема задаётся в useForm, а сообщения об ошибках полей прокидываются в error-messages.
Vuelidate
С vuelidate правила объявляются декларативно, а ошибки полей так же прокидываются в error-messages.
API
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
description | string | undefined | — | Описание формы. Рендерится под заголовком через CdsDescription. |
disabled | boolean | null | undefined | null | Заблокированное состояние |
firstFail | boolean | undefined | — | Останавливает валидацию на первом же невалидном поле — остальные поля не проверяются |
label | string | undefined | — | Заголовок формы. Рендерится над контентом через CdsDescription. |
modelValue | boolean | null | undefined | null | Итоговая валидность формы: true — все поля прошли проверку, false — есть ошибки, null — форма ещё не валидировалась |
readonly | boolean | null | undefined | null | Только для чтения |
validateOn | ValidateOn | undefined | 'input' | Когда запускать валидацию полей формы: при вводе, потере фокуса или только вручную |
События
| Имя | Тип | Описание |
|---|---|---|
submit | [payload: SubmitEventPromise] | Отправка формы. Событие — Promise с результатом валидации. |
update:modelValue | [value: boolean | null] | Изменение общего статуса валидности формы (v-model). |
Слоты
| Имя | Тип | Описание |
|---|---|---|
default | { errors: FieldValidationResult[]; isDisabled: boolean | null | undefined; isReadonly: boolean | null | undefined; isValidating: boolean; isValid: boolean | null | undefined; items: FormField[]; validate: () => Promise<FormValidationResult>; reset: () => void; resetValidation: () => void; } | Основной контент формы. Получает текущее состояние и методы валидации. |
description | any | Описание формы (переопределяет проп description). |
label | any | Заголовок формы (переопределяет проп label). |
Exposed
| Имя | Тип | Описание |
|---|---|---|
errors | { id: string | number; errorMessages: string[]; }[] | Ошибки валидации полей формы: идентификатор поля и его сообщения об ошибках. |
isDisabled | boolean | null | undefined | Заблокированы ли все поля формы. |
isReadonly | boolean | null | undefined | Доступны ли поля формы только для чтения. |
isValid | boolean | null | undefined | Валидность формы: true — все поля прошли проверку, false — есть ошибки, null — форма ещё не валидировалась. |
isValidating | boolean | Идёт ли сейчас валидация формы. |
items | { id: string | number; validate: () => Promise<string[]>; reset: () => Promise<void>; resetValidation: () => Promise<void>; vm: Raw<ComponentInternalInstance>; isValid: boolean | null; errorMessages: string[]; }[] | Зарегистрированные в форме поля с их состоянием валидации. |
resetValidation | () => void | Сбрасывает только состояние валидации, сохраняя введённые значения. |
validate | () => Promise<{ valid: boolean; errors: FieldValidationResult[] | { id: string | number; errorMessages: string[]; }[]; }> | Запускает валидацию всех полей формы и возвращает результат вместе со списком ошибок. |