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

如何为vee-validate自定义验证器传递参数?

VeeValidate 2.1.4自定义验证器传参报错解决

问题场景

我有一个自定义验证器,绑定到下拉组件时原本正常工作:

<select id="salesOwnerIdInput" v-model="currentCompany.salesOwnerId" name="salesOwnerId"
        v-validate.immediate="{ 'required': salesOwnerRequired, 'contains': !userHasPlanAccess }"
        :class="{'form-control': true, 'is-invalid': errors.has('main-tab.salesOwnerId') }"
        data-vv-as="Sales Owner" 
        data-vv-scope="main-tab">
    <option value="">- Select -</option>
    <option v-for="option in ownerList" v-bind:value="option.id" v-bind:key="option.id">
        {{ option.name }}
    </option>
</select>

但尝试给contains验证器添加参数时,写成下面的格式出现报错:

v-validate.immediate="{ 'required': salesOwnerRequired, 'contains:test': !userHasPlanAccess }"

错误信息:

vee-validate.esm.js:290 Uncaught (in promise) Error: [vee-validate] No such validator 'contains:test' exists.

自定义验证器代码:

const ContainsValidator = {
    params: [
        'message'
    ],
    getMessage(field, args) {
        return 'get message from args';
    },
    validate(value, args) {
        return false;
    }
}

我尝试在注册验证器时添加参数名称,但没有效果:

VeeValidate.Validator.extend("contains", ContainsValidator, { paramNames: ['message'] });

使用版本:vee-validate 2.1.4

解决方法

VeeValidate 2.x版本中,带参数的验证器不能用contains:test这种写法,框架会把整个字符串当成不存在的验证器名。正确的传参方式有两种:

方式1:数组格式

数组第一个元素是验证启用的布尔值,后面依次跟参数值:

v-validate.immediate="{ 
  'required': salesOwnerRequired, 
  'contains': [ !userHasPlanAccess, 'test' ] 
}"

方式2:对象格式

通过enabled字段控制验证是否启用,其他字段对应验证器声明的参数名:

v-validate.immediate="{ 
  'required': salesOwnerRequired, 
  'contains': { 
    enabled: !userHasPlanAccess, 
    message: 'test' 
  } 
}"

另外,注册验证器时不需要额外指定paramNames,你的验证器已经通过params属性声明了参数,直接注册即可:

VeeValidate.Validator.extend("contains", ContainsValidator);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:57:28