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

如何让Yup在邮箱为空时仅返回必填错误而非格式错误

解决Yup邮箱字段空值时多错误提示的问题

你的问题出在验证顺序和触发条件上:当前先执行格式匹配验证,再执行必填验证,且abortEarly: false会让所有验证规则跑完,导致空邮箱同时触发格式错误和必填错误。要实现“空值只提示必填,非空才检查格式”,可以通过条件验证让格式规则仅在邮箱非空时生效。

修改后的代码如下:

let obj = { tradingName: "", phone: "", email: "", address: "" };

let schema = Yup.object({
  tradingName: Yup.string().required("Trading Name is required"),
  phone: Yup.string().required("phone is required"),
  email: Yup.string()
    .required("Email is Required")
    // 仅当邮箱非空时,才执行格式验证
    .when('email', {
      is: val => val.trim() !== '', // 排除空字符串和纯空格的情况
      then: schema => schema.matches(
        /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i,
        "Invalid email address"
      )
    }),
  address: Yup.string().required("address is required")
});

schema
  .validate(obj, { abortEarly: false })
  .catch((err) => console.log(err.errors));

或者也可以用test方法自定义验证逻辑,效果一致:

email: Yup.string()
  .required("Email is Required")
  .test(
    'valid-email',
    'Invalid email address',
    function(value) {
      // 空值直接通过,交给required规则处理
      if (!value || value.trim() === '') return true;
      const regex = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
      return regex.test(value);
    }
  )

调整后效果:

  • 邮箱为空时,仅触发required的错误提示
  • 邮箱填写内容但格式错误时,仅触发格式错误提示
  • 不会因为重复错误干扰表单进度统计

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:50:21