【发布时间】:2020-11-24 23:00:18
【问题描述】:
我在 React 中使用joi-browser 进行表单验证。我面临的问题是在输入时验证password 和confirmPassword。
我使用的架构与另一个 stackoverflow question 中提供的架构相同。
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 字段匹配,则必须删除错误。
代码逻辑是,状态中的所有字段都定义在formData中,所有错误都会存储在state.errors中的同名对象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;
};
【问题讨论】:
标签: reactjs validation joi