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

React表单Yup验证:5个输入框至少填一个的实现方案

React表单Yup实现“至少填写一个字段”校验方案

1. 修正初始值配置

首先需要补全5个输入框的初始值,确保每个domain字段都在initialValues中:

initialValues={{
  domain0: "",
  domain1: "",
  domain2: "",
  domain3: "",
  domain4: ""
}}

2. Yup校验逻辑实现

通过Yup.object().test()方法添加全局自定义校验规则,检查5个字段中是否至少有一个非空值:

validationSchema={(Yup) =>
  Yup.object().shape({
    // 单个字段无需设置required,仅做格式校验(如需)
    domain0: Yup.string(),
    domain1: Yup.string(),
    domain2: Yup.string(),
    domain3: Yup.string(),
    domain4: Yup.string()
  }).test(
    'at-least-one-domain', // 校验规则名称,用于定位错误
    '请至少填写一个字段', // 错误提示文本
    function (formValues) {
      // 遍历所有domain字段,判断是否存在非空(去除首尾空格后)的值
      return Object.values(formValues).some(domain => domain.trim() !== '')
    }
  )
}

3. 表单中渲染错误提示

在校验不通过时,需要在表单合适位置显示全局错误信息,同时补全React循环元素的key属性:

<div>
  <Label className="" text="Domains" />
  {/* 渲染全局校验错误 */}
  {errors['at-least-one-domain'] && <div className="text-danger">{errors['at-least-one-domain']}</div>}
  <div className="oui-row oui-px-2">
    {[...Array(5)].map((e, i) => {
      return (
        <div className="col-4" key={i}>
          <Input
            type="text"
            name={`domain${i}`}
            value={values[`domain${i}`]}
            validationProps={props}
          />
        </div>
      )
    })}
  </div>
</div>

关键说明

  • 单个字段不设置required,避免强制要求每个字段都填写
  • 使用Object.values().some()高效判断是否存在有效输入
  • 全局校验错误通过校验规则名称at-least-one-domain从errors对象中获取
  • 循环渲染时添加key属性,符合React性能优化规范

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:30:51