Проверка формы может быть довольно сложной, поэтому я уверен, что вы в конечном итоге будете использовать библиотеку. На данный момент, чтобы ответить на ваш вопрос, нам нужно подумать о порядке отправки формы. Вот простой пример:
- "Pre-отправить"
- Установите
isSubmitting
в true
- Перейдите к «Проверка»
"Проверка"
- Запустить все проверки на уровне поля, используя
validationRules
- Есть ли ошибки?
- Да: отменить отправку. Установите ошибки, установите
isSubmitting
на false
- Нет: перейдите к «представлению»
"Представление"
- Продолжите запуск обработчика отправки (т. Е.
onSubmit
или handleSubmit
)
- Установите
isSubmitting
в false
И минимальная реализация будет выглядеть примерно так:
// ...imports
import validateForm from "../helpers/validateForm";
import styles from "./styles";
import validationRules from "./validationRules";
const propTypes = {
onSubmit: PropTypes.func.isRequired,
onSubmitError: PropTypes.func.isRequired,
initialValues: PropTypes.shape({
searchValue: PropTypes.string,
circle: PropTypes.string,
searchCriteria: PropTypes.string
})
};
const defaultProps = {
initialValues: {}
};
class SearchForm extends Component {
constructor(props) {
super(props);
this.validateForm = validateForm.bind(this);
this.state = {
isSubmitting: false,
values: {
searchValue: props.initialValues.searchValue || "",
circle: props.initialValues.circle || "",
searchCriteria: props.initialValues.searchCriteria || ""
},
...this.initialErrorState
};
}
get hasErrors() {
return !!(
this.state.searchValueError ||
this.state.circleError ||
this.state.searchCriteriaError
);
}
get initialErrorState() {
return {
searchValueError: null,
circleError: null,
searchCriteriaError: null
};
}
handleBeforeSubmit = () => {
this.validate(this.onValidationSuccess);
};
validate = (onSuccess = () => {}) => {
this.clearErrors();
this.validateForm(validationRules)
.then(onSuccess)
.catch(this.onValidationError);
};
onValidationSuccess = () => {
this.setState({ isSubmitting: true });
this.props
.onSubmit(this.state.values)
.catch(this.props.onSubmitError)
.finally(() => this.setState({ isSubmitting: false }));
};
onValidationError = errors => {
this.setState({ ...errors });
};
clearErrors = () => {
this.setState({ ...this.initialErrorState });
};
updateFormValue = fieldName => event => {
this.setState(
{
values: { ...this.state.values, [fieldName]: event.target.value }
},
() => this.validate()
);
};
render() {
// ...
}
}
SearchForm.propTypes = propTypes;
SearchForm.defaultProps = defaultProps;
export default withStyles(styles)(SearchForm);
Как вы можете видеть, если поток отправки будет увеличиваться (например, касаться входных данных, ошибок передачи и т. Д.), Степень сложности внутри компонента также значительно возрастет. Вот почему предпочтительнее использовать хорошо поддерживаемую библиотеку. Formik - это мое личное предпочтение на данный момент.
Не стесняйтесь проверять обновленные коды и коробки . Надеюсь, это поможет.