2

我的数据结构如下所示:

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

4

1 回答 1

1

when()只能访问同一级别的属性。从文档中

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

根据同级或同级子字段调整架构。您可以提供一个对象文字,其中键是值或匹配器函数,然后提供真正的模式和/或失败条件。

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

Yup 的 Github 上至少存在一个问题,作者建议通过 Yup 的 context 参数传递数据,但我认为使用 Formik 和validationSchemaprop 是不可能的,假设这就是你正在使用的。

于 2019-04-23T19:56:54.963 回答