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

Vue.js使用vee-validate验证动态输入字段时错误全量显示问题求解

问题原因

vee-validate默认通过name属性作为校验字段的唯一标识,所有动态生成的输入框name均为fairPaid时,框架会将其识别为同一个校验字段,因此任意字段校验失败都会触发所有同name字段的错误提示。

不修改name属性的最优解决方案

使用vee-validate内置的data-vv-scope属性为每个循环生成的字段分配独立的校验作用域,即可实现同name字段的校验隔离,完全不需要改动name属性值,修改后的模板代码如下:

<tr v-for="(input,k) in forminputs" :key="k">
  <td>
    <input 
      v-validate="'required'" 
      name="fairPaid" 
      type="text" 
      :data-vv-scope="`input_${k}`"
      :class="['form-control', {'is-invalid': errors.has('fairPaid', `input_${k}`)}]" 
      v-model="input.fairPaid"
    >
    <div v-show="errors.has('fairPaid', `input_${k}`)" class="invalid-feedback">
      {{ errors.first('fairPaid', `input_${k}`) }}
    </div>
  </td>
</tr>

实现逻辑

data-vv-scope会为当前字段指定专属的校验命名空间,相同name但不同scope的字段会被vee-validate识别为独立的校验对象,错误信息会按scope独立存储,不会互相影响,完全满足你不修改name属性的需求。

备选方案

如果你的vee-validate版本不支持data-vv-scope参数,可以给每个input额外加自定义属性存原始name值,校验用带索引的name,提交表单时读取自定义属性即可保留原有业务逻辑:

<input 
  v-validate="'required'" 
  :name="`fairPaid_${k}`"
  data-original-name="fairPaid"
  type="text" 
  :class="['form-control', {'is-invalid': errors.has(`fairPaid_${k}`)}]" 
  v-model="input.fairPaid"
>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 02:24:03