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

如何访问Yup对象的父级属性?Formik表单条件验证问题

解决方案

要实现「除非name.isNameUnknown为true,否则idNumber.number和idNumber.label为必填」的验证规则,你可以通过以下两种方式正确访问isNameUnknown的值:

方式一:使用根路径字符串+when配置对象

直接在number和label字段上通过完整根路径指定依赖,配合when的配置对象写法:

const validationSchema = Yup.object({
  name: Yup.object({
    first: Yup.string(),
    last: Yup.string(),
    isNameUnknown: Yup.boolean()
  }),
  idNumber: Yup.object({
    number: Yup.number().when("name.isNameUnknown", {
      is: false, // 当isNameUnknown为false时
      then: (schema) => schema.required("ID号码为必填项"),
      otherwise: (schema) => schema.optional()
    }),
    label: Yup.string().when("name.isNameUnknown", {
      is: false,
      then: (schema) => schema.required("标签为必填项"),
      otherwise: (schema) => schema.optional()
    })
  })
});

方式二:使用函数依赖访问根对象

通过when的函数参数获取表单根对象,直接读取isNameUnknown,这种写法更直观,避免路径解析问题:

const validationSchema = Yup.object({
  name: Yup.object({
    first: Yup.string(),
    last: Yup.string(),
    isNameUnknown: Yup.boolean()
  }),
  idNumber: Yup.object({
    number: Yup.number().when(
      (_, context) => context.root.name.isNameUnknown,
      {
        is: false,
        then: (schema) => schema.required("ID号码为必填项"),
        otherwise: (schema) => schema.optional()
      }
    ),
    label: Yup.string().when(
      (_, context) => context.root.name.isNameUnknown,
      {
        is: false,
        then: (schema) => schema.required("标签为必填项"),
        otherwise: (schema) => schema.optional()
      }
    )
  })
});

为什么之前的写法会得到undefined

你之前在idNumber对象上调用.when("name.isNameUnknown")时,Yup会以idNumber作为当前上下文查找路径,而idNumber内部并没有name.isNameUnknown这个字段,所以会返回undefined。正确的做法是在需要验证的子字段(number/label)上设置when,并确保依赖路径指向根对象的name.isNameUnknown,或者通过context.root直接访问根表单对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:05:57