You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React:使用Formik和Yup验证动态字段时的必填校验异常

动态数组字段的Formik+Yup校验问题解决

问题现状

动态生成的ruleValue字段(属于campaignRules数组内的每个元素),即使已经输入值,Formik仍提示“缺失值”,需要实现必填检查和数字类型校验。

错误原因

当前校验Schema中,ruleValue被定义为顶层字段,但实际目标字段是campaignRules数组里每个元素的value属性,校验路径不匹配,导致Formik无法正确识别数组内字段的校验状态。

修正方案

1. 调整校验Schema

使用Yup的array().of()方法定义数组内元素的校验规则,将campaignRules数组的每个元素作为对象校验,指定value字段的必填和数字类型规则:

import * as Yup from 'yup';

export const CampaignEditValidationSchema = Yup.object({
  campaignName: Yup.string().required('Campaign name is required'),
  startDate: Yup.date().nullable().required('Start Date is required'),
  // 注意:原Schema中的content字段未在表单定义中出现,若无需校验可删除该行
  content: Yup.string().required('Content is required'),
  campaignRules: Yup.array().of(
    Yup.object({
      value: Yup.number()
        .typeError('Value must be a valid number') // 数字类型错误提示
        .required('Value can\'t be left blank') // 必填校验
    })
  )
  // 可选:如果要求至少添加一条规则,可添加以下配置
  // .min(1, 'At least one rule is required')
});

2. 确认字段路径匹配

表单定义中ruleValue的name属性已经正确指向数组内的字段:

ruleValue: {
  name: `campaignRules[${index}].value`,
  // ...其他配置
}

RuleCard组件中引用该字段名的写法保持不变即可,确保与Schema中的campaignRules[].value路径完全对应。

3. 扩展数字类型校验(可选)

如果需要更严格的数字校验(比如整数、正数范围),可以扩展value的规则:

value: Yup.number()
  .typeError('Value must be a number')
  .integer('Value must be an integer') // 限制为整数
  .positive('Value must be a positive number') // 限制为正数
  .min(1, 'Value can\'t be less than 1') // 最小值限制
  .required('Value can\'t be left blank')

验证效果

修正后,当campaignRules数组中某条规则的value字段被填写且为有效数字时,Formik将不再提示该字段的错误;若未填写或输入非数字内容,则会触发对应的错误提示。

内容的提问来源于stack exchange,提问作者Ashar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 13:35:18