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

Yup嵌套子Schema访问父级RuleSchema的validationTypeCode值方法

解决Yup嵌套Schema访问父级字段的方案

Yup本身支持两种常用的方式实现嵌套子Schema读取父级字段值:


方案1:在校验test函数中直接读取根级字段

利用test函数上下文的resolve方法配合相对路径的ref,可以直接读取到外层父级的字段值,不需要额外传参,适用于绝大多数场景:

import * as Yup from 'yup'

export const RuleSchema = Yup.object().shape({
    description: Yup.string().required('必填').min(2).max(25),
    fieldId: Yup.number().required('必填'),
    validationTypeCode: Yup.string().required('必填'),
    failureAction: Yup.string().required('必填'),
    failureActionValue: Yup.string().required('必填'),
    dataEntryWorkFlowRuleValidationList: Yup.array().of(
        Yup.object().shape({
            fieldValue: Yup.string().test(
                'fieldValueValidate', // 校验规则名称,可自定义
                '字段值不符合当前校验类型要求', // 错误提示
                function (value) {
                    // 直接读取父级的validationTypeCode
                    const validationTypeCode = this.resolve(Yup.ref('validationTypeCode'))
                    
                    // 示例:根据不同的validationTypeCode走不同校验逻辑
                    switch(validationTypeCode) {
                        case 'EMAIL':
                            return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)
                        case 'PHONE':
                            return /^1[3-9]\d{9}$/.test(value)
                        default:
                            return value?.length >=5
                    }
                }
            )
        })
    )
})

方案2:通过context传值给子Schema

如果你需要在多个地方使用该父级字段,也可以在校验触发时将父级字段传入上下文,子Schema通过$前缀直接读取上下文变量:

第一步:定义Schema时使用上下文变量

export const RuleSchema = Yup.object().shape({
    // 其他字段保持不变
    description: Yup.string().required('必填').min(2).max(25),
    fieldId: Yup.number().required('必填'),
    validationTypeCode: Yup.string().required('必填'),
    failureAction: Yup.string().required('必填'),
    failureActionValue: Yup.string().required('必填'),
    dataEntryWorkFlowRuleValidationList: Yup.array().of(
        Yup.object().shape({
            fieldValue: Yup.string()
                .when('$validationTypeCode', {
                    is: 'EMAIL',
                    then: (schema) => schema.email('请输入正确的邮箱格式'),
                })
                .when('$validationTypeCode', {
                    is: 'PHONE',
                    then: (schema) => schema.matches(/^1[3-9]\d{9}$/, '请输入正确的手机号'),
                })
                .min(5)
        })
    )
})

第二步:触发校验时传入上下文

// 校验时把需要的父级字段传入context
const validateResult = await RuleSchema.validate(formData, {
    context: {
        validationTypeCode: formData.validationTypeCode
    }
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:36:02