Formik 错误对象未在输入时正确更新

Posted

技术标签:

【中文标题】Formik 错误对象未在输入时正确更新【英文标题】:Formik errors object is not being updated properly on input 【发布时间】:2022-01-19 17:34:54 【问题描述】:

在这里进入一个新的代码库,这也是我第一次使用 Formik 和 Yup,所以我会尽量简洁,但请耐心等待。

我有一些使用 Formik 构建的表单,并使用 Yup 提供的验证模式。我还有一个 useState 变量来指示 Yup 的 errors 对象中是否存在一个项目,该对象用于防止用户继续下一个表单,直到错误得到修复。验证最初可以正常工作,因为当提供无效输入时,errors 对象中会显示相应的错误。但是,如果我在字段中输入有效的内容,然后返回并更改它以使其无效,则 errors 对象不会更新以反映该新错误,直到下一个输入事件,这会抛出状态的值变量检查它。一个基本的例子:

输入邮箱:testgmail.com ---> errors:email: "Invalid email"

输入邮箱:test@gmail.com ---> errors

输入邮箱:test@gmail ---> errors

直到我触发下一个输入,errors 才会填充回email: "Invalid email"

知道如何解决这个问题吗?我将尝试在下面提供一些清理过的代码,但再次道歉,因为它对我来说是一个全新的代码库,所以我不确定它会有多大用处。

const validate = Yup.object().shape(
    name: Yup.string().required("This field is required"),
    email: Yup.string()
      .email("Invalid email format")
      .required("Your email is required"),
    code: Yup.string().required("This field is required"),
  );

function handleInputChange(e: any, errors: FormikErrors, errorSetter: any, codeSetter: any, codeInfo: any) 
    codeSetter( ...codeInfo, [e.target.name]: e.target.value );
    if (Object.keys(errors).length > 0) 
      errorSetter(true);
    
    else errorSetter(false)
  

<Formik
            initialValues=
              name: codeInfo.name,
              email: codeInfo.email,
              code: codeInfo.code,
            
            onSubmit=() => 
            validationSchema=validate
          >
            (
              handleSubmit,
              handleChange,
              values,
              errors,
              touched,
              handleBlur,
            ) => (
              <form className=styles.form onSubmit=handleSubmit>
                <div className=styles.formTextfields>
                  <div className=styles.textfields>
                    <span className=styles.tag>Email*</span>
                    <TextField
                      name="email"
                      value=values.email
                      placeholder="test@gmail.com"
                      onChange=handleChange
                      onBlur=handleBlur
                      onInput=(e: any) => handleInputChange(e, errors)
                      variant=
                        errors.email && touched.email ? "error" : "focus"
                      
                    />
                    errors.email && touched.email ? (
                      <div className=styles.error>errors.email</div>
                    ) : null
                  </div>
              </form>
            )
</Formik>

【问题讨论】:

【参考方案1】:

也许我缺少一些东西,但我不明白 handleInputChange 函数是如何工作的......你可以尝试删除那个道具。

Formik 已经在使用 handleChange 和 handleBlur 处理程序处理字段更改和字段模糊,因此它已经在进行验证检查。

这是您可能会使用的一些工作代码(我已删除名称和代码字段,因为它们不会出现在您代码的任何字段中)

const validate = Yup.object().shape(
  email: Yup.string()
    .email("Invalid email format")
    .required("Your email is required"),
);

const Component = () => 
  return (
    <Formik
      initialValues=
        email: "",
      
      onSubmit=() => 
      validationSchema=validate
    >
      (
        handleSubmit,
        handleChange,
        values,
        errors,
        touched,
        handleBlur,
      ) => 
        return (
          <form onSubmit=handleSubmit>
            <div>
              <span>Email*</span>
              <TextField
                name="email"
                value=values.email
                placeholder="test@gmail.com"
                onChange=handleChange
                onBlur=handleBlur
              />
              errors.email && touched.email ? <div>errors.email</div> : null
            </div>
          </form>
        );
      
    </Formik>
  );
;

【讨论】:

以上是关于Formik 错误对象未在输入时正确更新的主要内容,如果未能解决你的问题,请参考以下文章

Formik 在空字段上也显示错误

Formik - API 调用后更新初始值

日期对象 SimpleDateFormat 未在 Java(Android)环境中正确解析时间戳字符串

Formik 中如何保存输入字段中的数据

Formik 收音机不适用于嵌套对象值

PayPal REST SDK 未在 execute() 上返回正确状态