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

Yup .mixed() not working with sibling child

我的数据结构是这样的:

{
  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 抛出错误。我错过了什么?

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

mixed.when(keys: string | Array, builder: object | (value, schema)=> Schema): Schema

Adjust the schema based on a sibling or sibling children fields. You can provide an object literal where the key is is value or a matcher function, then provides the true schema and/or otherwise for the failure condition.

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

至少有 one issue on Yup's Github,作者建议通过 Yup 的上下文参数传递数据,但我认为使用 Formik 和 validationSchema 道具是不可能的,假设这就是你的正在使用。