В связке react-hook-form и
@hookform/resolvers/yup объект errors является
центральным результатом валидации формы. Он формируется на основе
ValidationError, который генерируется библиотекой Yup, и
преобразуется резолвером в структуру, понятную механизму управления
формой.
Объект errors представляет собой древовидную структуру,
где ключи соответствуют именам полей формы, а значения — объектам
описания ошибки.
Типовая форма:
errors = {
email: {
type: "required",
message: "Email обязателен",
ref: HTMLInputElement
},
profile: {
firstName: {
type: "min",
message: "Слишком короткое имя",
ref: HTMLInputElement
}
}
}
Ключевые характеристики:
a.b.c, который преобразуется в вложенные объектыYup генерирует объект ошибки следующего вида:
ValidationError {
name: "ValidationError",
message: "Invalid input",
path: "profile.firstName",
type: "min",
inner: [...]
}
Ключевым элементом является массив inner, содержащий все
ошибки при abortEarly: false:
inner: [
{
path: "email",
message: "Email обязателен",
type: "required"
},
{
path: "profile.firstName",
message: "Минимум 3 символа",
type: "min"
}
]
Резолвер преобразует этот массив в объект errors,
группируя элементы по path.
При работе yupResolver выполняется следующая логика:
schema.validate(data, { abortEarly: false })ValidationErrorinnerinner маппится по pathПример преобразования:
"path": "profile.firstName"
превращается в:
errors.profile.firstName
Каждое поле в errors содержит стандартизированный набор
свойств.
Определяет тип нарушения валидации.
Примеры:
requiredminmaxemailmatchesЗначение берётся напрямую из Yup-валидатора.
Человекочитаемое описание ошибки.
message: "Минимальная длина — 3 символа"
Формируется на уровне Yup через message в схеме.
Ссылка на DOM-элемент поля формы.
Используется для:
setFocusПример:
ref: HTMLInputElement
Используется для хранения глобальных ошибок формы, не привязанных к конкретному полю.
errors.root = {
message: "Ошибка сервера",
type: "server"
}
При использовании criteriaMode: "all" возможно наличие
нескольких ошибок для одного поля.
errors.password = {
types: {
min: "Минимум 8 символов",
matches: "Должен содержать цифру"
},
message: "Некорректный пароль"
}
Особенности:
types содержит список всех нарушенных правилmessage обычно хранит первую или агрегированную
ошибкуYup поддерживает сложные схемы, включая объекты и массивы. Это
напрямую отражается в errors.
Схема:
{
profile: yup.object({
name: yup.string().required(),
age: yup.number().min(18)
})
}
Результат:
errors.profile.name.message
errors.profile.age.message
Для массивов используется индексная адресация:
Схема:
users: yup.array().of(
yup.object({
email: yup.string().required()
})
)
Ошибки:
errors.users[0].email.message
errors.users[1].email.message
Особенности:
При отключённом раннем завершении Yup собирает все ошибки:
schema.validate(data, { abortEarly: false })
В этом режиме:
innererrors попадает каждая ошибка поляcriteriaMode: "all")Если включено раннее завершение:
inner может быть пустым или содержать один элементerrors содержит минимальное количество данныхЭто влияет на полноту объекта:
errors = {
email: {
type: "required",
message: "Обязательное поле"
}
}
Резолвер выполняет преобразование путей:
| Yup path | errors structure |
|---|---|
| user.name | errors.user.name |
| items[0].title | errors.items[0].title |
| a.b.c | errors.a.b.c |
Правила:
При наличии нескольких ошибок одного поля:
types, если включён
criteriaMode: "all"Пример:
errors.password = {
type: "min",
message: "Слишком короткий пароль"
}
или
errors.password = {
types: {
min: "Слишком короткий",
max: "Слишком длинный"
}
}
Объект errors интегрирован в жизненный цикл формы:
handleSubmittriggermode: "onChange" | "onBlur"При сложных схемах возникают особенности:
Если ошибка возникает в a.b.c, промежуточные узлы
создаются автоматически:
errors.a.b.c
при этом a и b могут быть пустыми объектами
без message.
При конфликте структуры формы и схемы:
Это влияет на интерпретацию errors.
При использовании useFieldArray структура
errors изменяется динамически:
Yup позволяет задавать кастомные сообщения:
yup.string().required("Поле обязательно")
Эти сообщения напрямую попадают в:
errors.field.message
Тип ошибки берётся из валидатора:
requiredminmaxЕдиничный узел ошибки может включать:
{
type: string,
message: string,
ref: HTMLElement,
types?: Record<string, string>,
root?: {
message: string,
type: string
}
}
При валидации отдельных полей через
trigger("field"):
errors остаётся стабильнойОбъект errors не предназначен для сериализации:
ref)Обобщённая модель:
errors — деревоpath