Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是的,根据父级(parent.parent)的同级使用不同的模式_Javascript_Yup - Fatal编程技术网

Javascript 是的,根据父级(parent.parent)的同级使用不同的模式

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

在模式中,我想根据父级的兄弟级调整模式

例如,如果toggleMonday为true,那么weekdays->monday应该有一个特定的验证模式

现在,下面的示例起作用了。然而,它相当冗长

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 }
    , {}
    )