React formik 表单验证:如何最初禁用提交按钮

use*_*989 29 validation reactjs yup formik

下面是我使用的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);
    }
  });
Run Code Online (Sandbox Code Playgroud)

我试图在我的按钮上使用它:

 disabled={!formik.isValid}
Run Code Online (Sandbox Code Playgroud)

但只有当我尝试提交表单时它才真正有效。因此,如果我将表单留空并点击提交,则会显示所有验证错误,然后禁用该按钮。但是,它应该从一开始就被禁用。我检查了文档,但没有看到任何明显的东西。

Rah*_*pta 66

如果您想submit在表单加载时最初禁用按钮,您可以使用以下内容的使用dirty : boolean属性Formik

disabled={!formik.dirty}
Run Code Online (Sandbox Code Playgroud)

如果您想在submit所有字段值都有效之前保持按钮禁用,那么您可以使用isValid: boolean它的工作方式如下:

如果没有错误(即错误对象为空),则返回 true,否则返回 false。

因此,您可以将其用作:

disabled={!formik.isValid}
Run Code Online (Sandbox Code Playgroud)

现在,如果您希望在所有字段都有效之前禁用提交按钮,并且如果字段值已从其初始值更改,那么您必须结合使用上述两个属性,如下所示:

disabled={!(formik.isValid && formik.dirty)}
Run Code Online (Sandbox Code Playgroud)

  • 如果有一些有效的初始值,按钮将永远不会被启用。 (2认同)

Pau*_*iwo 6

您可以添加validateOnMount并将其设置为 true

const formik = useFormik({
    validateOnMount: true, // <================= Add this
    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);
    }
  });
Run Code Online (Sandbox Code Playgroud)

使用按钮

disabled={!formik.isValid}


kvb*_*vba 5

要最初禁用按钮,只需检查触摸对象是否为空并保持这种方式,直到所有字段都通过验证 !isValid

disabled={!isValid || (Object.keys(touched).length === 0 && touched.constructor === Object)}
Run Code Online (Sandbox Code Playgroud)