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

Yup表单验证遇循环依赖错误,求解决三字段至少填一的校验问题

Yup循环依赖问题解决方法

错误原因

你的Schema中存在字段间的循环引用:username的when规则依赖phone字段,而phone的when规则又反过来依赖username字段。Yup在处理这种交叉依赖时会检测到循环,从而抛出Cyclic dependency错误。

修正方案

不要在单个字段上用when互相依赖,而是在整个对象级别添加自定义验证规则,直接检查三个字段中至少填写一个:

const userSchema = yup
  .object()
  .shape({
    username: yup.string(),
    email: yup.string().email('Please enter a valid email'),
    phone: yup.string(),
    password: yup
      .string()
      .min(8, 'Password must be 8 characters long')
      .matches(/[0-9]/, 'Password requires a number')
      .matches(/[a-z]/, 'Password requires a lowercase letter')
      .matches(/[A-Z]/, 'Password requires an uppercase letter')
      .matches(/[^\w]/, 'Password requires a symbol')
      .required('Password is required')
  })
  .test(
    'at-least-one-contact',
    '请填写用户名、邮箱或电话中的至少一项',
    (values) => {
      // 检查三个字段中至少有一个非空
      return !!values.username || !!values.email || !!values.phone;
    }
  )
  .required();

说明

  • 移除了username和phone上的when规则,彻底避免字段间的循环引用
  • 通过object.test方法添加全局验证,直接校验业务核心需求:三个联系字段至少填写一个
  • 错误提示可根据场景调整,统一提示能让用户更清晰地理解要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:37:16