element-ui中的多层表单循环验证处理

项目中有如下需求:

可以添加一个列表 => 添加弹框 => 里面可以添加多个产品(产品里面可以添加多个对接人跟政策),所以数据结构应该如下

ruleForm: {
        companyName: '', // 公司名称
        financialProduct: [
          // 产品数组
          {
            productName: '', // 产品名称
            dockingPerson: [
              // 对接人
              {
                dockingName: '', // 联系人
              }
            ],
            financialPolicy: [
              // 返利政策
              {
                makeWay: '', // 计提条件
              }
            ]
          }
        ]
      },

但是在提交表单的时候验证不了,rule不起作用,因为数据是循环出来的,所以不起作用,解决办法如下

<template>
  <div class="addProduct_wrapper">
      <!-- 中间内容区域 -->
      <div class="center_content">
        <el-form
          ref="ruleForm"
          :model="ruleForm"
          label-width="80px"
          :rules="rules">
          <!-- 上方的列表 -->
          <div class="basic_info">
            <div class="info_box">
              <el-form-item label="公司名称" prop="companyName">
                <el-input placeholder="请输入公司的名称" v-model="ruleForm.companyName"></el-input>
              </el-form-item>
            </div>
          <!-- 产品盒子 -->
          <div class="product_box" v-for="(item, index) in ruleForm.financialProduct" :key="index">
            <!-- 关闭按钮 -->
            <span class="closeBtn" @click="delateProduct(index)" v-if="index !== 0">X</span>
            <!-- 产品详情 -->
            <div class="product_detail">
              <el-form-item label="产品详情"></el-form-item>
              <!-- name盒子 -->
              <div class="name_box">
                <div style="width: 300px;">
                  <el-form-item label="产品名称"
                    :prop="`financialProduct.${index}.productName`"
                    :rules="financialProductRules.productName">
                    <el-input placeholder="请输入产品名称" v-model="item.productName"></el-input>
                  </el-form-item>
                </div>
              </div>
            </div>
            <!-- 对接人 -->
            <div class="pickPeople">
              <el-form-item label="对接人" label-width="95px"></el-form-item>
              <div class="people_wrapper" v-for="(items, indexs) in ruleForm.financialProduct[index].dockingPerson" :key="indexs">
                <div>
                  <el-form-item label="对接人"
                    :prop="`financialProduct.${index}.dockingPerson.${indexs}.dockingName`"
                    :rules="dockingPerson.dockingName"
                  >
                    <el-input placeholder="请输入联系人姓名" v-model="items.dockingName"></el-input>
                  </el-form-item>
                </div>
              </div>
              <el-button type="primary" style="margin-left: 10px;" @click="addPickPeople(index)">添加对接人</el-button>
            </div>
            <!-- 政策 -->
            <div class="rebatePolicy">
              <el-form-item label="政策"></el-form-item>
              <div class="rebate_box" v-for="(homes, indexHomes) in item.financialPolicy" :key="indexHomes">
                <div>
                  <el-form-item label="政策"
                    :prop="`financialProduct.${index}.financialPolicy.${indexHomes}.makeWay`"
                    :rules="dockingPerson.makeWay"
                  >
                    <el-input placeholder="政策" v-model="homes.makeWay"></el-input>
                  </el-form-item>
                </div>
                <div>
                  <el-form-item label="">
                    <el-button type="primary" @click="delateRebatePolicy(item.financialPolicy, indexHomes)" v-if="editStatus !== 3">删除</el-button>
                  </el-form-item>
                </div>
              </div>
              <el-button type="primary" style="margin-left: 10px;" @click="addRebatePolicy(index)" v-if="editStatus !== 3">添加政策</el-button>
            </div>
          </div>
          <!-- 添加产品 -->
          <el-button type="primary" style="margin: 20px 0px 30px 32px;" @click="addProduct()" v-if="editStatus !== 3">添加产品</el-button>
          <div class="btn_submit" v-if="editStatus !== 3">
            <el-form-item>
              <el-button type="primary" @click="onSubmit(ruleForm)">确认保存</el-button>
              <el-button @click="closeLayers">取消</el-button>
            </el-form-item>
          </div>
        </el-form>
      </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      ruleForm: {
        companyName: '', // 公司名称
        financialProduct: [
          // 产品数组
          {
            productName: '', // 产品名称
            dockingPerson: [
              // 对接人
              {
                dockingName: '', // 联系人
              }
            ],
            financialPolicy: [
              // 返利政策
              {
                makeWay: '', // 计提条件
              }
            ]
          }
        ]
      },
      rules: {
        companyName: [
          { required: true, message: '请输入活动名称', trigger: 'blur' }
        ],
      },
      financialProductRules: {
        productName: [
          { required: true, message: '请输入产品名称', trigger: 'blur' }
        ]
      },
      dockingPerson: {
        dockingName: [
          { required: true, message: '请输入联系人姓名', trigger: 'blur' }
        ],
        makeWay: [
          { required: true, message: '请输入计提条件', trigger: 'blur' }
        ]
      }
    };
  },
  methods: {
    onSubmit(formName) {
      this.$refs['ruleForm'].validate(valid => {
        if (valid) {
          console.log(this.ruleForm, '提交的表单');
        } else {
          return false;
        }
      });
    },
  },
};
</script>
<style scoped lang="scss">

</style>

 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 是一个流行的 JavaScript 框架,用于构建用户界面和单页面应用程序。Element UI 是一个基于 Vue.js 的组件库,提供了丰富的 UI 组件和工具。在 Vue 使用 Element UI 构建表单,可以通过循环来动态生成表单项并进行验证。 首先,我们可以使用 Vue 的 v-for 指令来循环渲染表单项。通过遍历数据源(如数组或对象)来动态生成表单字段,例如输入框、下拉框、复选框等。这样就可以实现根据数据源的变化而动态生成不同数量的表单项,方便灵活地管理表单内容。 其次,通过 Element UI 提供的验证规则和验证器,可以实现对表单循环验证。我们可以为每个表单项设置相应的验证规则(如必填、格式验证等),并通过验证器对整个表单进行验证。在循环,可以动态添加、修改或删除验证规则,以实现对动态生成的表单项的实时验证。 另外,可以利用 Element UI 提供的表单组件和事件处理机制来实现更进一步的表单循环验证。例如,可以监听表单项的输入变化、聚焦和失焦事件,在相应的事件处理函数进行数据的验证和反馈。这样就可以及时提示用户输入的正确与否,提升用户体验。 总之,使用 Vue 和 Element UI 可以很容易地实现表单循环验证。通过动态生成表单项、设置验证规则和事件处理,可以灵活地管理和验证表单数据,提供更好的用户交互体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值