Я использую joi-browser
для проверки формы в React . Проблема, с которой я столкнулся, - это проверка password
и confirmPassword
на входе.
Схема, которую я использую, такая же, как и в другом вопросе о переполнении стека .
password: Joi.string().min(3).max(15).required(),
confirmPassword: Joi.any().valid(Joi.ref('password')).required().options({ language: { any: { allowOnly: 'must match password' } } })
Как только я начинаю набирать confirmPassword
, появляется моя ошибка, даже если она такая же, как password
, а при отправке она исчезает и отправляет форму. но если confirmPassword
не то же самое, он не может отправить, что все в порядке.
Я хочу, он должен проверяться на событии onChange
, и если confirmPassword
поле совпадает с полем password
, ошибка должна
Код logi c есть, все поля определены в formData
в состоянии, и все ошибки будут сохраняться в errors
объекте с таким же именем в state.errors
. Если возникает ошибка, он создает запись в объекте ошибок, иначе удаляет ее из объекта ошибок.
Состояние моей формы:
state = {
formData: {
password: '',
confirmPassword: ''
},
errors: {}
}
Метод onChange:
onChangeField = ({ currentTarget: input }) => {
const errors = { ...this.state.errors };
const errorMsg = this.validateField(input);
if (errorMsg) errors[input.name] = errorMsg;
else delete errors[input.name];
const formData = { ...this.state.formData };
formData[input.name] = input.value;
this.setState({ formData, errors });
}
validateField = ({ name, value }) => {
const obj = { [name]: value };
const schema = { [name]: this.schema[name] };
const { error } = Joi.validate(obj, schema);
return error ? error.details[0].message : null;
};