我的数据结构如下:
{
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
;如果foo
是true
,则bar不会因未提供具有所需对象的数组而引发错误。
如果我设置bar
来进行其他验证,请说:
bar: yup.mixed().when('foo', {
is: true,
then: yup.string().required()
otherwise: yup.string.nullable(true)
})
它按预期为bar
引发错误。我想念什么?
答案 0 :(得分:0)
when()
只能访问同一级别的属性。来自the documentation:
mixed.when(关键字:字符串|数组,生成器:对象|(值,模式)=>模式):模式
根据同级或同级子级字段调整架构。您可以提供键为值或匹配器函数的对象文字,然后提供真实的模式和/或其他用于失败情况的信息。
这就是第二个示例可行的原因(因为bar
和foo
是兄弟姐妹)。一种可能的解决方案是重新排列数据,以使foo
和baz
是同级的。
至少有one issue on Yup's Github,并且作者建议通过Yup的context参数传递数据,但是我认为使用Formik和validationSchema
属性是不可能的,前提是您正在使用