如何在Yup校验schema的results部分.test()中访问questions的值?
在Yup的results校验中访问questions数组的值
你可以通过Yup提供的context参数获取整个表单的完整数据,具体来说,context.parent指向当前校验对象的父级(也就是整个quiz对象),以此就能拿到questions数组的数据。
具体实现方法
- 在
test函数的第二个参数context中,通过context.parent.questions获取questions数组的全部内容。 - 对questions数组做聚合计算(比如统计最小总分),再和当前result的值做校验对比。
修正后的代码示例
const quizSchema = Yup.object().shape({ questions: Yup.array().of( Yup.object().shape({ // 示例问题校验规则:每个问题必填points数字字段 points: Yup.number().required('Points are required') }) ), results: Yup.array().of( Yup.object().shape({ // 示例结果校验规则:每个结果必填minPoints数字字段 minPoints: Yup.number().required('Min points are required') }) .test( 'covers-all-values', 'The first result should cover the minimum possible point total from all choices.', function(value, context) { // 获取顶层对象的questions数据 const { questions } = context.parent; // 计算所有问题的最小总分(可根据实际业务逻辑调整计算方式) const totalMinPoints = questions?.reduce((sum, question) => sum + question.points, 0) || 0; // 仅校验第一个result的minPoints是否匹配总最小分 if (context.path.includes('[0]')) { return value.minPoints === totalMinPoints; } // 非第一个result直接通过校验 return true; } ) ), });
关键注意点
context.parent能直接访问到顶层对象的所有属性,包括questions。- 要处理
questions可能为undefined的情况,避免触发报错。 - 示例中通过
context.path判断是否为第一个result,匹配你需求中“第一个结果需覆盖最小总分”的校验逻辑。
内容的提问来源于stack exchange,提问作者Jimmy Blundell
相关产品推荐
相关产品推荐

