Javascript 是的,根据父级(parent.parent)的同级使用不同的模式
在模式中,我想根据父级的兄弟级调整模式 例如,如果toggleMonday为true,那么weekdays->monday应该有一个特定的验证模式 现在,下面的示例起作用了。然而,它相当冗长Javascript 是的,根据父级(parent.parent)的同级使用不同的模式,javascript,yup,Javascript,Yup,在模式中,我想根据父级的兄弟级调整模式 例如,如果toggleMonday为true,那么weekdays->monday应该有一个特定的验证模式 现在,下面的示例起作用了。然而,它相当冗长 const schema=yup.object().shape({ toggleMonday:yup.bool().required(), toggleTuesday:yup.bool().required(), Toggle周三:yup.bool().required(), ToggleThready:y
const schema=yup.object().shape({
toggleMonday:yup.bool().required(),
toggleTuesday:yup.bool().required(),
Toggle周三:yup.bool().required(),
ToggleThready:yup.bool().required(),
toggleFriday:yup.bool().required(),
toggleSaturday:yup.bool().required(),
toggleSunday:yup.bool().required(),
工作日:是的。对象()
//工作,切换星期一是工作日的兄弟
.当('切换星期一'){
是的,
然后:是的。object()。shape({
星期一:yup.array().of(yup.object().shape(daySchema)).daySchemaFirstTimeslotRequired(),
星期二:yup.array().of(yup.object().shape(daySchema)),
星期三:yup.array().of(yup.object().shape(daySchema)),
星期四:yup.array().of(yup.object().shape(daySchema)),
星期五:yup.array().of(yup.object().shape(daySchema)),
星期六:yup.array().of(yup.object().shape(daySchema)),
sunday:yup.array().of(yup.object().shape(daySchema)),
}),
})
.when('切换星期二'){
是的,
然后:是的。object()。shape({
星期一:yup.array().of(yup.object().shape(daySchema)),
星期二:yup.array().of(yup.object().shape(daySchema)).daySchemaFirstTimeslotRequired(),
星期三:yup.array().of(yup.object().shape(daySchema)),
星期四:yup.array().of(yup.object().shape(daySchema)),
星期五:yup.array().of(yup.object().shape(daySchema)),
星期六:yup.array().of(yup.object().shape(daySchema)),
sunday:yup.array().of(yup.object().shape(daySchema)),
}),
})
//等等。
});
正如你所看到的,这是相当重复的
本例中使用了mixed.when()
方法。但是,您似乎只能针对同级或同级子字段
将其分别嵌套在“每一天”下不起作用,因为这些天嵌套在“工作日”中
类似于:
const schema = yup.object().shape({
toggleMonday: yup.bool().required(),
toggleTuesday: yup.bool().required(),
toggleWednesday: yup.bool().required(),
toggleThursday: yup.bool().required(),
toggleFriday: yup.bool().required(),
toggleSaturday: yup.bool().required(),
toggleSunday: yup.bool().required(),
weekdays: yup.object()
// does not work, toggleMonday is not a sibling of 'monday'
monday: yup.array().when('toggleMonday', {
is: true,
then: yup.array().of(yup.object().shape(daySchema)).daySchemaFirstTimeslotRequired(),
otherwise: yup.array().of(yup.object().shape(daySchema)),
}),
tuesday: yup.array().when('toggleMonday', {
is: true,
then: yup.array().of(yup.object().shape(daySchema)).daySchemaFirstTimeslotRequired(),
otherwise: yup.array().of(yup.object().shape(daySchema)),
}),
// etc.
});
有什么建议吗?经过一番挖掘,我发现了这个PR: 似乎解决方法()是使用上下文:
//将根数据传递给上下文
schema.validateSync(数据,{context:{data:data})
//在测试中,您可以只访问根数据
.test('myValidator','MyValidation message',函数(值){
const data=this.options.context.data;
//对根数据执行需要执行的操作
})
这意味着我应该使用上下文通过道具获取切换项,并在模式中使用它们
与这个问题有点无关:我也使用formik作为输入值。它只支持通过HOC和formik()
我将坚持使用verbose方法,因为实现将非常具体,由于实现细节的原因,它不容易在我的整个应用程序中重复使用。是的,它提供了一个声明式api,但您不局限于编写这样巨大的对象文本。您的模式相当复杂,但是如果没有其他方法来改变它,请考虑以编程方式编写它——-< /P>
const weekdays =
[ 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday' ]
const schema = yup.object().shape({
toggleMonday: yup.bool().required(),
toggleTuesday: yup.bool().required(),
toggleWednesday: yup.bool().required(),
toggleThursday: yup.bool().required(),
toggleFriday: yup.bool().required(),
toggleSaturday: yup.bool().required(),
toggleSunday: yup.bool().required(),
weekdays: weekdays.reduce(whenToggle, yup.object())
})
现在我们只需在切换时实现-
const day =
yup.object().shape(daySchema)
const title = (str = "") =>
str.substr(0,1).toUpperCase() + str.substr(1)
const whenToggle = (y = {}, day = "") =>
y.when
( `toggle${title(day)}`
, { is: true, then: yup.object().shape(firstTimeslot(day)) }
)
最后实现firstTimeslot
-
const dayList =
yup.array().of(day)
const firstTimeslot = (day = "") =>
weekdays.reduce
( (r, d) =>
d === day
? { ...r, [d]: dayList.daySchemaFirstTimeslotRequired() }
: { ...r, [d]: dayList }
, {}
)