В связке с YupResolver ключевую роль играет механизм
повторной валидации перед каждым отправлением формы. Любое исправление
данных должно приводить к актуализации состояния ошибок, иначе повторная
отправка может происходить на основе устаревшего результата предыдущей
проверки.
При использовании схемы Yup и резолвера в библиотеках
вроде React Hook Form, логика повторной отправки строится вокруг
нескольких этапов: обновление значений, повторная валидация, очистка
ошибок, и только затем запуск onSubmit.
При каждом вызове handleSubmit резолвер
YupResolver запускает повторную проверку схемы. Это
означает, что предыдущие ошибки не сохраняются автоматически — они
пересчитываются на основе текущих значений формы.
Ключевой момент заключается в том, что исправление одного поля может влиять на валидность всей формы:
yup.validate() через resolverformState.errorsЕсли ошибка была устранена, она исчезает до момента отправки, и форма становится валидной без дополнительных действий со стороны разработчика.
handleSubmit при повторной попыткеПовторная отправка после исправления ошибок всегда проходит через один и тот же pipeline:
onSubmitonErrorВажно понимать, что повторная отправка не «дополняет» предыдущую попытку, а полностью заменяет её. Это означает отсутствие накопления ошибок или состояний между попытками.
Режимы mode и reValidateMode существенно
влияют на поведение исправлений перед повторной отправкой.
При этом режиме:
Это означает, что пользователь может исправить данные, но ошибки исчезнут только при следующем submit.
В этом случае:
YupResolverЭто снижает вероятность повторной отправки с ошибками, но увеличивает количество вычислений схемы.
При использовании YupResolver очистка ошибок происходит
автоматически, но только при условии повторной валидации.
Типичный сценарий:
email содержит ошибкуtrigger или handleSubmit вызывает
повторную проверкуerrors.email удаляется из состоянияЕсли же валидация не была запущена повторно, ошибка остаётся в состоянии, даже если значение уже корректное.
trigger() в
повторной отправкеМетод trigger() используется для принудительной
повторной валидации без отправки формы. Он особенно важен в сценариях,
где требуется подготовить форму к повторному submit после частичных
исправлений.
Типичный сценарий:
await trigger();
handleSubmit(onSubmit)();
Использование trigger() обеспечивает:
onErrorПри повторной отправке часто возникает проблема расхождения между:
YupResolver всегда работает с текущими значениями формы, а не с внешними состояниями. Поэтому любые попытки хранить промежуточные данные вне формы могут приводить к несоответствиям при повторной отправке.
Если схема Yup включает асинхронные проверки (например, проверку уникальности email через API), повторная отправка становится чувствительной к состоянию запроса.
Сценарий:
Важно учитывать, что каждый submit запускает новую цепочку асинхронных проверок, даже если предыдущая уже завершилась.
При повторной отправке после исправлений часто возникает проблема множественных запросов. Она не связана напрямую с YupResolver, но проявляется на уровне UI.
Используются следующие механизмы:
const { isSubmitting } = formState;
При isSubmitting === true повторные клики submit
игнорируются.
<button disabled={isSubmitting}>
Это предотвращает повторный запуск submit до завершения текущего цикла.
После успешного onSubmit часто выполняется:
reset();
Это гарантирует, что повторная отправка начинается с чистого состояния формы, а не с частично изменённого.
YupResolver отвечает только за клиентскую валидацию. Однако при
повторной отправке часто добавляются серверные ошибки через
setError.
Сценарий:
setError('email', { message: 'уже используется' })Важно, что серверные ошибки не очищаются автоматически YupResolver, они требуют явного обновления состояния формы.
В некоторых приложениях схема Yup может динамически изменяться:
При изменении схемы:
handleSubmit используют новую версию
validation schemaЭто особенно важно при условной валидации через
when().
Yup не кэширует результаты валидации по умолчанию, поэтому каждая повторная отправка после исправления выполняет полную проверку схемы.
Это означает:
При повторной отправке важно учитывать следующие состояния:
isDirty — форма была изменена после последнего
submitisValid — текущее состояние валидностиdirtyFields — список изменённых полейПосле исправления ошибок:
isDirty обычно остаётся trueisValid может изменяться динамическиdirtyFields определяет, какие поля пересчитывалисьЭти значения напрямую влияют на UX повторной отправки и позволяют оптимизировать поведение кнопок и подсказок.
После успешной отправки часто выполняется reset, что
возвращает форму к начальному состоянию.
Однако при частичном сбросе:
reset(values);
повторная отправка может происходить уже с обновлёнными defaultValues, что влияет на результат YupResolver.
Важно учитывать, что схема Yup не зависит от defaultValues напрямую, но влияет на итоговую структуру данных, передаваемых в submit.
Полный цикл выглядит следующим образом:
onSubmitonErrorЭта цепочка всегда детерминирована текущими значениями формы и не зависит от предыдущих попыток отправки.