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

如何用Yup验证两个对象的指定属性值不同?

如何用Yup校验两个对象的对应属性值不同?

针对你提供的场景,想要校验personA和personB的id值不相同,可以通过Yup的**自定义校验方法.test()**来实现,下面提供两种常用的实现方式:

方式一:给personB的id字段添加自定义校验

这种方式会把错误提示直接关联到personB.id字段,更符合表单字段级校验的直观性:

export default Yup.object().shape({
    personA: Yup.object().shape({
        id: Yup.number()
            .typeError("Must be a valid number")
            .required("Required field")
    }),
    personB: Yup.object().shape({
        id: Yup.number()
            .typeError("Must be a valid number")
            .required("Required field")
            .test(
                'id-not-duplicate', // 校验规则的唯一标识(可选,用于调试)
                'personB的ID不能与personA的ID相同', // 错误提示信息
                function(value) {
                    // 通过this.parent获取整个表单的根对象,从而拿到personA的id
                    const { personA } = this.parent;
                    // 先确保personA的id已填写,避免未输入时触发错误
                    if (!personA?.id) return true;
                    // 比较两个id是否不同,返回true表示校验通过,false则触发错误
                    return value !== personA.id;
                }
            )
    })
});

方式二:在根对象上添加全局校验

如果希望错误提示关联到整个表单(或者需要同时校验两个字段的状态),可以在根对象上添加自定义校验:

export default Yup.object().shape({
    personA: Yup.object().shape({
        id: Yup.number()
            .typeError("Must be a valid number")
            .required("Required field")
    }),
    personB: Yup.object().shape({
        id: Yup.number()
            .typeError("Must be a valid number")
            .required("Required field")
    })
}).test(
    'ids-not-equal', // 校验规则标识
    'personA和personB的ID不能相同', // 错误提示
    function(value) {
        const { personA, personB } = value;
        // 确保两个id都已填写后再进行比较
        if (!personA?.id || !personB?.id) return true;
        return personA.id !== personB.id;
    }
);

关键说明

  • .test()方法是Yup实现自定义校验的核心,它需要三个参数:校验标识(用于内部区分)、错误提示文本、校验逻辑函数。
  • 在校验函数中,this.parent(方式一)或参数value(方式二)可以获取到整个表单的数据源,从而实现跨字段的属性比较。
  • 先判断字段是否已填写再进行比较,是为了避免在用户未完成输入时就触发错误提示,提升表单的用户体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:22:56