У меня есть состояние formErrors
примерно так:
const [formErrors, setFormErrors] = useState({});
И у меня есть обработчик onSubmit()
примерно так:
const onSubmit = () => {
validateForm();
if(formErrors.length === 0) {
// submit form
}
}
Функция validateForm()
просто заполняет formErrors
если есть ошибки.
Этот onSubmit
запускается с помощью свойства onClick
кнопки "Отправить".
Итак, что происходит:
- Я нажимаю «Отправить».
onSubmit()
метод вызывается. validateForm()
вызывается. setFormErrors()
вызывается из validateForm()
. - Поскольку состояние установки асинхронное, оно переместится в строку
if(formErrors.length === 0)
, которая на этом этапе вернет true
. - Форма отправляется (это нежелательное поведение, так как этого не должно быть).
setFormErrors()
готово и устанавливает formErrors в [error1, error2]
. Означает, что formErrors.length
действительно должно быть > 0
.
Состояние, не обновляющееся немедленно, вызывает ошибку, при которой я могу отправить форму, даже если присутствуют ошибки из-за условия true
сначала, прежде чем стать false
(где onSubmit()
функция уже завершена).
Как решить эту проблему?