React formik 表单验证:如何最初禁用提交按钮
React formik form validation: How to initially have submit button disabled
下面是我的 React
表单验证代码,我在其中使用了 formik
。默认情况下,当表单加载时,我希望禁用提交按钮:
import { useFormik } from "formik";
import * as Yup from "yup";
const formik = useFormik({
initialValues: {
firstName: "",
lastName: "",
email: ""
},
validationSchema: Yup.object({
firstName: Yup.string()
.max(15, "Must be 15 characters or less")
.min(3, "Must be at least 3 characters")
.required("Required"),
lastName: Yup.string()
.min(3, "Must be at least 3 characters")
.max(20, "Must be 20 characters or less")
.required("Required"),
email: Yup.string()
.email("Invalid email address")
.required("Required")
}),
onSubmit: values => {
handleSubmit(values);
}
});
我试过在我的按钮上使用这个:
disabled={!formik.isValid}
但它只有在我尝试提交表单时才有效。因此,如果我将表单留空并点击提交,则会显示所有验证错误,然后按钮将被禁用。但是,它应该从一开始就被禁用。我检查了 documentation 但没有看到任何明显的东西。
Formik 会跟踪字段值和错误,但会公开它们供您使用,这过去是使用渲染道具模式通过 formProps 完成的,但现在似乎是 useFormik 挂钩返回的 formik 变量的一部分。
我建议从将初始值移除为常量开始。然后您需要访问 formik 的错误对象。我没有使用新的钩子语法完成此操作,但是,查看文档我希望 "formik.errors" 可以工作(这在 formProps.errors 中使用渲染道具公开)。最后,禁用提交按钮应该检查 formik.values 是否等于初始值或错误对象不为空。
如果您希望在加载表单时最初禁用 submit
按钮,您可以使用 Formik
的 dirty : boolean
属性,如下所示:
disabled={!formik.dirty}
如果您想在所有字段值都有效之前一直禁用 submit
按钮,那么您可以使用 isValid: boolean
,其工作方式如下:
Returns true if there are no errors (i.e. the errors object is empty) and false otherwise.
因此您可以将其用作:
disabled={!formik.isValid}
现在,如果您希望在所有字段都有效之前禁用提交按钮,并且如果字段值已从其初始值更改,那么您将不得不使用以上两个属性结合如下:
disabled={!(formik.isValid && formik.dirty)}
要让按钮最初被禁用,只需检查触摸对象是否为空并保持这种状态,直到所有字段都通过 !isValid
验证
disabled={!isValid || (Object.keys(touched).length === 0 && touched.constructor === Object)}
您可以添加 validateOnMount
并将其设置为 true
const formik = useFormik({
initialValues: {
validateOnMount: true, // <================= Add this
firstName: "",
lastName: "",
email: ""
},
validationSchema: Yup.object({
firstName: Yup.string()
.max(15, "Must be 15 characters or less")
.min(3, "Must be at least 3 characters")
.required("Required"),
lastName: Yup.string()
.min(3, "Must be at least 3 characters")
.max(20, "Must be 20 characters or less")
.required("Required"),
email: Yup.string()
.email("Invalid email address")
.required("Required")
}),
onSubmit: values => {
handleSubmit(values);
}
});
在按钮上使用
disabled={!formik.isValid}
我正在使用
"formik": "^2.2.6"
在我的例子中,我是这样做的。我不想在初始验证消息中显示消息,所以我这样做了。
我正在使用基于 class 的组件
<Formik
......
validateOnBlur={true}
validateOnChange={true}
{({handleChange, values, touched, errors, handleBlur }) => (<>
..........
<Form.Control
placeholder="Name"
type="text"
name="field_dba"
value={values.name}
onChange={handleChange}
onFocus={handleBlur} // It plays a role to change the touched property
isInvalid={touched.name && !!errors.name}
isValid={!errors.name}
className="form-input"
/>
<label className="modal-lab">Name *</label>
// Here i'm checking the field is touched or not
{touched.name ? <Form.Control.Feedback type="invalid" className="text-capitalize"> {errors.name} </Form.Control.Feedback> : null}
在最后禁用按钮,直到它全部通过验证。我正在使用这个
<button disabled={Array.isArray(errors) || Object.values(errors).toString() != ""} type="submit"> Submit </button>
如果这适用于相同版本,请投赞成票。
下面是我的 React
表单验证代码,我在其中使用了 formik
。默认情况下,当表单加载时,我希望禁用提交按钮:
import { useFormik } from "formik";
import * as Yup from "yup";
const formik = useFormik({
initialValues: {
firstName: "",
lastName: "",
email: ""
},
validationSchema: Yup.object({
firstName: Yup.string()
.max(15, "Must be 15 characters or less")
.min(3, "Must be at least 3 characters")
.required("Required"),
lastName: Yup.string()
.min(3, "Must be at least 3 characters")
.max(20, "Must be 20 characters or less")
.required("Required"),
email: Yup.string()
.email("Invalid email address")
.required("Required")
}),
onSubmit: values => {
handleSubmit(values);
}
});
我试过在我的按钮上使用这个:
disabled={!formik.isValid}
但它只有在我尝试提交表单时才有效。因此,如果我将表单留空并点击提交,则会显示所有验证错误,然后按钮将被禁用。但是,它应该从一开始就被禁用。我检查了 documentation 但没有看到任何明显的东西。
Formik 会跟踪字段值和错误,但会公开它们供您使用,这过去是使用渲染道具模式通过 formProps 完成的,但现在似乎是 useFormik 挂钩返回的 formik 变量的一部分。
我建议从将初始值移除为常量开始。然后您需要访问 formik 的错误对象。我没有使用新的钩子语法完成此操作,但是,查看文档我希望 "formik.errors" 可以工作(这在 formProps.errors 中使用渲染道具公开)。最后,禁用提交按钮应该检查 formik.values 是否等于初始值或错误对象不为空。
如果您希望在加载表单时最初禁用 submit
按钮,您可以使用 Formik
的 dirty : boolean
属性,如下所示:
disabled={!formik.dirty}
如果您想在所有字段值都有效之前一直禁用 submit
按钮,那么您可以使用 isValid: boolean
,其工作方式如下:
Returns true if there are no errors (i.e. the errors object is empty) and false otherwise.
因此您可以将其用作:
disabled={!formik.isValid}
现在,如果您希望在所有字段都有效之前禁用提交按钮,并且如果字段值已从其初始值更改,那么您将不得不使用以上两个属性结合如下:
disabled={!(formik.isValid && formik.dirty)}
要让按钮最初被禁用,只需检查触摸对象是否为空并保持这种状态,直到所有字段都通过 !isValid
disabled={!isValid || (Object.keys(touched).length === 0 && touched.constructor === Object)}
您可以添加 validateOnMount
并将其设置为 true
const formik = useFormik({
initialValues: {
validateOnMount: true, // <================= Add this
firstName: "",
lastName: "",
email: ""
},
validationSchema: Yup.object({
firstName: Yup.string()
.max(15, "Must be 15 characters or less")
.min(3, "Must be at least 3 characters")
.required("Required"),
lastName: Yup.string()
.min(3, "Must be at least 3 characters")
.max(20, "Must be 20 characters or less")
.required("Required"),
email: Yup.string()
.email("Invalid email address")
.required("Required")
}),
onSubmit: values => {
handleSubmit(values);
}
});
在按钮上使用
disabled={!formik.isValid}
我正在使用
"formik": "^2.2.6"
在我的例子中,我是这样做的。我不想在初始验证消息中显示消息,所以我这样做了。
我正在使用基于 class 的组件
<Formik
......
validateOnBlur={true}
validateOnChange={true}
{({handleChange, values, touched, errors, handleBlur }) => (<>
..........
<Form.Control
placeholder="Name"
type="text"
name="field_dba"
value={values.name}
onChange={handleChange}
onFocus={handleBlur} // It plays a role to change the touched property
isInvalid={touched.name && !!errors.name}
isValid={!errors.name}
className="form-input"
/>
<label className="modal-lab">Name *</label>
// Here i'm checking the field is touched or not
{touched.name ? <Form.Control.Feedback type="invalid" className="text-capitalize"> {errors.name} </Form.Control.Feedback> : null}
在最后禁用按钮,直到它全部通过验证。我正在使用这个
<button disabled={Array.isArray(errors) || Object.values(errors).toString() != ""} type="submit"> Submit </button>
如果这适用于相同版本,请投赞成票。