是的.mixed()无法与兄弟姐妹一起工作

时间:2019-04-23 19:20:15

标签: javascript validation formik yup

我的数据结构如下:

{
  foo: true,
  bar: {
    baz: [{label: 'mario', url: 'https://nintendo.com'}]
  }
}

我的yup验证器如下所示:

  const schema = yup.object().shape({
    foo: yup.boolean(),
    bar: yup.mixed().when('foo', {
      is: true,
      then: yup.object().shape({
        baz: yup.array.of(
          yup.object().shape({
            label: yup.string.required(),
            url: yup.url().required()
          })
        )
      }),
      otherwise: yup.object().nullable(true)
    })
  })

但是验证不适用于bar.baz;如果footrue,则bar不会因未提供具有所需对象的数组而引发错误。

如果我设置bar来进行其他验证,请说:

  bar: yup.mixed().when('foo', {
    is: true,
    then: yup.string().required()
    otherwise: yup.string.nullable(true)
  })

它按预期为bar引发错误。我想念什么?

1 个答案:

答案 0 :(得分:0)

when()只能访问同一级别的属性。来自the documentation

  

mixed.when(关键字:字符串|数组,生成器:对象|(值,模式)=>模式):模式

     

根据同级或同级子级字段调整架构。您可以提供键为值或匹配器函数的对象文字,然后提供真实的模式和/或其他用于失败情况的信息。

这就是第二个示例可行的原因(因为barfoo是兄弟姐妹)。一种可能的解决方案是重新排列数据,以使foobaz是同级的。

至少有one issue on Yup's Github,并且作者建议通过Yup的context参数传递数据,但是我认为使用Formik和validationSchema属性是不可能的,前提是您正在使用