我试图在使用formik和yup验证提交之前验证表单。表单由两部分组成,验证第一个表单,然后加载下一个表单。我设置状态handleShow(true)
来触发第二种形式。下面是我的代码
const UserOnboardSchema = Yup.object().shape({
gender: Yup.string().required('please select the gender'),
firstName: Yup.string().required('Please enter your first name'),
lastName: Yup.string().required('Please enter your last name'),
mobile: Yup.string()
.required('Please enter your mobile number')
.matches(phoneRegExp, 'Please enter valid phone number'),
workExperience: Yup.string().required('Please enter your work experience'),
});
const formik = useFormik({
initialValues: {
gender: '',
firstName: '',
lastName: '',
mobile: '',
workExperience: '',
currentRole: '',
},
validationSchema: UserOnboardSchema,
onSubmit: (values) => {
console.log(values);
formik.resetForm();
},
});
const handleSubmit = (e) => {
e.preventDefault();
formik.handleSubmit();
if (Object.entries(formik.errors).length === 0) {
handleShow(true);
} else {
handleShow(false);
}
};
这是handleSubmit
的问题,formik.handleSubmit
不工作。它直接访问if/else条件,因此加载第二个表单而不验证第一个表单。
if (Object.entries(formik.errors).length === 0) {
handleShow(true);
} else {
handleShow(false);
}
但如果我把handleShow(true)
直接给formik,像这样
const formik = useFormik({
initialValues: {
gender: '',
firstName: '',
lastName: '',
mobile: '',
workExperience: '',
currentRole: '',
},
validationSchema: UserOnboardSchema,
onSubmit: (values) => {
console.log(values);
handleShow(true); #----> Giving here.
formik.resetForm();
},
});
则formik和Yup验证工作。我不知道是什么导致了这个问题?
没有表单本身很难看出哪里出了问题。这里有一些有用的故障排除提示…
Formik不会触发onSubmit
方法,如果表单中有错误。所以,我的首选是:
- 检查表单中的任何错误,
- 查看
initialValues
对象是否有未使用的字段
我以前遇到过这个错误。看起来像是来自验证。我删除了shape()并将validate移动到object()中。希望能对你有所帮助