是的,基于父对象模式的条件验证

Ard*_*neh 5 javascript yup formik

我正在使用 array().of 方法创建 Yup 验证模式,我需要根据外部模式对象的值在该数组中设置一些验证规则。我如何获得对该值的引用?


const termsSchema = Yup.object().shape({
  termType: Yup.string().when('condition', {
    is: true,
    then: Yup.string()
      .required('Type is required'),
  }),
});

const schema = Yup.object().shape({
  condition: Yup.boolean()
    .required('Error'),
  terms: Yup.array().of(termsSchema),
});
Run Code Online (Sandbox Code Playgroud)

Abr*_*m L 8

非常确定您已经找到了解决方案/解决方法。然而,对于那些提出这个问题寻求潜在解决方案的人来说,这种方法可能会派上用场:

由于您需要嵌套模式的同级字段的值,因此您可以使用 创建嵌套模式when,例如:

const schema = Yup.object().shape({
  condition: Yup.boolean()
    .required('Error'),
  terms: mixed().when('condition',(value) => {
     // use any logic you need to build/modify the returned schema
     return array().of(termsSchema)
 }),
});
Run Code Online (Sandbox Code Playgroud)

使用 .when 访问嵌套字段是yup当前的限制,但是这种方法对我有用。我也很好奇你做了什么来解决这个问题。


HUG*_*DEV 5

来自 Yup 模式外部的变量可以通过使用when的回调函数访问。您可以对第一个参数使用任何虚拟字段,因为目的只是为了触发回调。一旦条件满足,后验证规则,然后将适用。欲了解更多信息,请参阅没错

let outside = true

const schema = Yup.object().shape({
  dummy:Yup.string(),
  terms: Yup.array().of(termsSchema).when("dummy", {
    is: (value) => 
      outside === true,
      then: Yup.number().required("Please provide info")
  }),
});
Run Code Online (Sandbox Code Playgroud)