是的 .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
;如果 foo
是 true
,如果没有给它包含所需对象的数组,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.
这就是您的第二个示例有效的原因(因为 bar
和 foo
是兄弟姐妹)。一种可能的解决方案是重新排列数据,使 foo
和 baz
成为兄弟。
至少有 one issue on Yup's Github,作者建议通过 Yup 的上下文参数传递数据,但我认为使用 Formik 和 validationSchema
道具是不可能的,假设这就是你的正在使用。
我的数据结构是这样的:
{
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
抛出错误。我错过了什么?
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.
这就是您的第二个示例有效的原因(因为 bar
和 foo
是兄弟姐妹)。一种可能的解决方案是重新排列数据,使 foo
和 baz
成为兄弟。
至少有 one issue on Yup's Github,作者建议通过 Yup 的上下文参数传递数据,但我认为使用 Formik 和 validationSchema
道具是不可能的,假设这就是你的正在使用。