开发者问题收集

Yup 中的条件验证

2018-03-20
341388

我有一个电子邮件字段,只有选中复选框时才会显示(布尔值为 true )。提交表单时,我只希望复选框被选中时(布尔值为 true)才需要此字段。

这是我到目前为止尝试过的:

const validationSchema = yup.object().shape({
   email: yup
         .string()
         .email()
         .label('Email')
         .when('showEmail', {
             is: true,
             then: yup.string().required('Must enter email address'),
         }),
    })

我尝试过其他几种变体,但 Formik 和 Yup 都出现错误:

Uncaught (in promise) TypeError: Cannot read property 'length' of undefined
    at yupToFormErrors (formik.es6.js:6198)
    at formik.es6.js:5933
    at <anonymous>
yupToFormErrors @ formik.es6.js:6198

而且我也收到 Yup 的验证错误。我做错了什么?

3个回答

您可能没有为 showEmail 字段定义验证规则。

我已经完成了 CodeSandox 测试,在我添加以下内容后,

showEmail: yup.boolean()

表单正确开始验证,没有抛出任何错误。

这是网址: https://codesandbox.io/s/74z4px0k8q

对于未来,这是正确的验证模式:

validationSchema={yup.object().shape({
    showEmail: yup.boolean(),
    email: yup
      .string()
      .email()
      .when("showEmail", {
        is: true,
        then: yup.string().required("Must enter email address")
      })
  })
}
João Cunha
2018-03-26

Formik 作者在此...

要使 Yup.when 正常工作,您必须将 showEmail 添加到 initialValues 和您的 Yup 架构形状中。

通常,在使用 validationSchema 时,最佳做法是确保您表单的所有字段都具有初始值,以便 Yup 可以立即看到它们。

结果将如下所示:

<Formik 
  initialValues={{ email: '', showEmail: false }}
  validationSchema={Yup.object().shape({
    showEmail: Yup.boolean(),
    email: Yup
      .string()
      .email()
      .when("showEmail", {
        is: true,
        then: Yup.string().required("Must enter email address")
      })
  })
}

/>
jaredpalmer
2020-08-25

您甚至可以对复杂情况使用函数。函数 case 有助于进行复杂的验证

validationSchema={yup.object().shape({
    showEmail: yup.boolean(),
    email: yup
      .string()
      .email()
      .when("showEmail", (showEmail, schema) => {
        if(showEmail)
          return schema.required("Must enter email address")
        return schema
      })
  })
}
sridhar..
2021-01-06