Урок 20. Справочник: компоненты формы и zod

📁 Раздел: shadcn/ui ⏱️ Время изучения: ~55 мин 🎯 Сложность: Продвинутая

⚡ Кратко

Компоненты: Field* — обвязка, Input, Textarea, Select, Checkbox, Switch, Label — ввод.

Установка

npx shadcn@latest add field input textarea select checkbox switch label button
npm install react-hook-form zod @hookform/resolvers

Части Field

КомпонентНазначение
Fieldобёртка одного поля; orientation: vertical, horizontal, responsive
FieldLabelподпись; принимает htmlFor
FieldDescriptionподсказка под полем
FieldErrorсообщение об ошибке; принимает массив errors
FieldGroupгруппа полей с общими отступами
FieldSet + FieldLegendсмысловая группа (<fieldset> и заголовок)
FieldSeparatorразделитель между блоками формы
FieldContent, FieldTitleдля полей-карточек: заголовок и описание рядом с переключателем

Элементы ввода

КомпонентКлючевые состояния
Inputdisabled, aria-invalid, placeholder
Textareaто же плюс rows
Selectdata-open, выбранный пункт, клавиатурная навигация
Checkboxdata-checked, data-disabled
Switchdata-checked, data-unchecked, размер sm
Labelpeer-disabled:opacity-50
Обратите внимание на имена состояний: примитивы Base UI используют data-checked, а не data-[state=checked] как в старых версиях на Radix.

Атрибуты доступности

АтрибутЗачем
htmlFor / idсвязь подписи и поля
aria-invalidполе заполнено неверно: оформление и объявление
aria-describedbyсвязь с подсказкой и ошибкой
role="alert"сообщение объявляется сразу
requiredобязательное поле
autoCompleteподстановка из браузера: email, current-password, new-password
inputModeклавиатура на мобильных: numeric, email, tel

Схема zod: частые правила

ПравилоЗапись
Обязательная строкаz.string().min(1, "Заполните поле")
Почтаz.email("Некорректный адрес")
Длина пароляz.string().min(8, "Минимум 8 символов")
Число в диапазонеz.number().min(1).max(100)
Список значенийz.enum(["start", "team"])
Обязательная галочкаz.literal(true, { message: "Примите условия" })
Сравнение полей.refine(fn, { path: ["confirm"] })
Необязательное полеz.string().optional()
⚠️ Проверить по документации: API zod менялся между мажорными версиями (например, z.string().email() и z.email()). Сверьтесь с версией в своём package.json.

react-hook-form: что используется чаще всего

ЧтоЗачем
useForm({ resolver })создать форму с валидацией по схеме
register("field")подключить неуправляемое поле
handleSubmit(onValid)валидировать и отправить
formState.errorsошибки по полям
formState.isSubmittingблокировка кнопки
Controllerподключить компонент, который управляется состоянием (Select, Checkbox)
reset()очистить форму после успешной отправки