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

Vue使用Vuelidate实现深层嵌套数组/对象复选框条件验证求助

问题核心原因

你当前的写法错误是因为requiredIf回调的第一个参数value仅代表当前selected字段的布尔值,本身不存在parent属性,所以无法获取到父级required的值。


可行解决方案

方案1:直接通过Vuelidate的验证节点层级访问父级属性

你使用的是嵌套$each的Vuelidate校验规则,可通过验证节点的$parent属性向上追溯父级数据,修改你的校验规则如下:

validations: {
    types: {
        $each: {
          agreements: {
            $each: {
              selected: {
                requiredIf: function () {
                  // 层级对应:selected节点 → agreements $each节点 → 当前type节点
                  return this.$parent.$parent.$model.required
                }
              }
            }
          }
        }
    }
}

注意:如果使用箭头函数会丢失this指向,需要改为普通函数写法。

方案2:抽离子组件简化校验(更易维护)

把单组协议的渲染和校验抽离为独立子组件,将当前type作为prop传入子组件,子组件内的校验规则可以直接读取prop的required值,无需追溯层级:
父组件模板:

<div class="mb-3" v-for="type in agreementTypes" :key="type.id">
  <h3 class="text-primary">{{ type.displayName }}</h3>
  <agreement-group :type="type" />
</div>

子组件接收type为prop,校验规则直接写:

props: ['type'],
validations: {
  type: {
    agreements: {
      $each: {
        selected: {
          requiredIf () {
            return this.type.required
          }
        }
      }
    }
  }
}

模板修复建议

你当前的模板存在两处冗余/错误:

  • 不要同时给复选框绑定v-model和:checked,v-model已经自动处理选中状态,保留v-model="agreement.selected"即可,删除:checked="agreement.active"避免冲突
  • label的for属性要和对应input的id匹配,把for="agreements"改为:for="agreement.id",实现点击label触发复选框切换的效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:06:03