Я работаю над компонентом React, который обрабатывает отправку формы.
<form
name="theForm"
ref={(el) => { this.theForm = el }}
onSubmit={this.handleSubmit}
noValidate
>
В обработчике события отправки я выполняю проверку, используя форму HTML5 checkvalidity (), вызывая другую функцию validateForm ();
handleSubmit(e) {
e.preventDefault();
if (this.validateForm()) {
//Call the api to post data
}
}
Если допустимость validateForm равна false, язаполнить список состояний с именем dirtyFormInputs, который передается дочерним компонентам формы.
Из-за асинхронного поведения setState я изменил свой код для обработки обновлений в списке dirtyFormInputs с помощью async / await следующим образом:
async validateForm() {
const formLength = this.theForm.length;
if (this.theForm.checkValidity() === false) {
this.setState({ dirtyFormInputs: [] });
for(let input of this.theForm){
input.nodeName.toLowerCase() !== 'button'
&& await this.validateInput(input);
}
return false;
}
return true;
}
Но так как я изменил метод validateInput для правильного обновления dirtyFormInputs, оператор return false для validateForm () больше не действует, и моя форма отправляется даже при сбое проверки valitidy.
validateInput(input) {
if (!input.validity.valid) {
return new Promise((resolve) => {
this.setState({
dirtyFormInputs: [...this.state.dirtyFormInputs, input.name]
}, resolve)
});
}
}