Formik 是一个流行的 React 库,用于处理表单的状态管理和验证。它允许开发者通过声明式的方式定义表单字段及其验证规则,从而简化了表单处理的复杂性。当涉及到多个字段的验证时,Formik 提供了几种机制来实现这一点。
Formik 验证:
以下是一个使用 Formik 和 Yup 进行多个字段验证的简单示例:
import React from 'react';
import { Formik, Form, Field, ErrorMessage } from 'formik';
import * as Yup from 'yup';
const validationSchema = Yup.object({
firstName: Yup.string()
.max(15, 'Must be 15 characters or less')
.required('Required'),
lastName: Yup.string()
.max(25, 'Must be 25 characters or less')
.required('Required'),
email: Yup.string()
.email('Invalid email address')
.required('Required'),
});
const MyForm = () => (
<Formik
initialValues={{ firstName: '', lastName: '', email: '' }}
validationSchema={validationSchema}
onSubmit={(values, { setSubmitting }) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
setSubmitting(false);
}, 400);
}}
>
{({ isSubmitting }) => (
<Form>
<Field type="text" name="firstName" />
<ErrorMessage name="firstName" component="div" />
<Field type="text" name="lastName" />
<ErrorMessage name="lastName" component="div" />
<Field type="email" name="email" />
<ErrorMessage name="email" component="div" />
<button type="submit" disabled={isSubmitting}>
Submit
</button>
</Form>
)}
</Formik>
);
export default MyForm;
问题: 表单提交时,即使字段无效,表单也会提交。
原因: 可能是因为 validateOnChange
或 validateOnBlur
设置为 false
,导致在提交前没有进行验证。
解决方法: 确保 validateOnChange
和 validateOnBlur
至少有一个设置为 true
,或者在 onSubmit
函数中手动调用 validateForm()
方法。
<Formik
// ...
validateOnChange={true}
validateOnBlur={true}
// ...
>
// ...
</Formik>
或者
onSubmit={(values, { setSubmitting, validateForm }) => {
validateForm().then(errors => {
if (Object.keys(errors).length === 0) {
// 表单验证通过,执行提交逻辑
}
});
}}
通过这种方式,可以确保在表单提交前,所有的字段都经过了正确的验证。
领取专属 10元无门槛券
手把手带您无忧上云