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

如何用Yup在Formik提交时校验FieldArray动态新增必填字段

Formik + Yup + FieldArray 动态字段提交不触发校验修复方案

核心问题根源

代码中FieldArray的操作逻辑存在两处与Formik API不匹配的错误,直接导致动态新增行的数值结构和Yup校验规则无法匹配,因此提交时不会触发对应校验:

  • 新增行参数错误:调用push()时传入了""空字符串,但insurance_details_array定义为对象数组结构,空字符串元素完全无法匹配Yup定义的对象校验规则
  • 删除行参数错误:调用remove()时传入了{ index }格式的对象,但FieldArray的remove方法要求直接传入数组索引数字才能正常识别需要删除的位置

逐点修复代码

1. 修正新增行的传参逻辑

首先定义和初始值结构完全对齐的空行模板,避免数值结构错位:

const EMPTY_INSURANCE_ROW = {
  policy_number: "",
  insurance_company: "",
  insured_amount: "",
  insurance_expiry: "",
  premium_term: ""
}

替换原有新增按钮的点击逻辑:

{/* 原有错误写法:onClick={() => push("")} */}
<button 
  type="button" 
  onClick={() => push(EMPTY_INSURANCE_ROW)} 
  className="btn btn-primary m-1"
>
  +
</button>

2. 修正删除行的传参逻辑

替换原有删除按钮的点击逻辑:

{/* 原有错误写法:onClick={() => remove({ index })} */}
{index > 0 ? 
  <button 
    type="button" 
    onClick={() => remove(index)} 
    className="btn btn-primary"
  >
    -
  </button> 
: ""}

原问题现象的底层原因

当你用push("")新增元素时,数组对应位置的值是纯字符串。此时Yup遍历数组执行校验时,遇到非对象类型的元素,无法识别嵌套的policy_number/insurance_company等字段的校验规则,因此提交时不会生成对应错误。只有你在输入框内输入内容时,Formik会自动把该位置的字符串替换为带对应字段的对象,此时数值结构和校验规则匹配,错误提示才会正常显示。

可选优化配置

如果调整完参数后仍存在漏校验的情况,可以在Formik组件上显式开启变更时校验,避免配置覆盖默认触发逻辑:

<Formik
  initialValues={initialValues}
  validationSchema={validationSchema}
  onSubmit={onSubmit}
  validateOnChange={true}
  validateOnBlur={true}
>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 22:15:08