Formik+Yup字段数组深层验证:年份关联日期字段提示问题
解决Formik嵌套字段数组的条件验证问题
直接给你修正后的验证方案,核心是调整Yup的when依赖和字段引用逻辑:
validationSchema={Yup.object({ title: Yup.string().required("名称必填"), year: Yup.string().required('请选择年份,日期选项已禁用'), holidays: Yup.array().of( Yup.object().shape({ name: Yup.string().required("名称必填"), date: Yup.string().when('$year', { is: (yearVal) => !yearVal, then: Yup.string().required('请先选择年份'), otherwise: Yup.string().required('此字段必填') }) }) ) }, ['year'])}
关键修正点:
- 移除冗余依赖:原代码里
when传入了holidays作为依赖,但我们只需要根据父级的year字段判断,完全不需要依赖当前的字段数组本身,删掉后避免不必要的验证触发。 - 明确父级字段引用:用
$year语法明确指定引用的是顶级表单的year字段,避免嵌套对象作用域导致的字段获取失败问题。 - 简化判断逻辑:用
!yearVal替代yearVal === "",更简洁地覆盖年份未选择的所有空值场景(比如undefined、空字符串)。 - 调整顶级依赖数组:只保留
year作为顶级依赖,确保年份变化时,整个holidays数组的验证会重新执行,保证提示信息实时更新。
结合你已经实现的「年份未选时日期选择器禁用」的交互,这个验证逻辑会完美匹配需求:
- 未选年份:日期框禁用,验证提示「请先选择年份」
- 已选年份:日期框可用,验证提示「此字段必填」
内容的提问来源于stack exchange,提问作者Milan jotva
相关产品推荐
相关产品推荐

