element表单动态生成多个表单项,并验证

项目中有需求,一行显示多个表单项,同时,这些表单项要支持动态增加与验证,实现效果如下:

点击右侧的加号就会生成一行部门数据,并支持删除与验证.

实现思路是:

一行展示多个表单项,使用layout布局实现(即el-row与el-col);

动态添加行,通过for循环div来实现;

主要的问题是验证,参考官网的例子,需要动态设置prop,并在单个表单项中添加验证,例子如下:

 只不过官网是新增的一个表单项,我们是三个.

整合之后,具体的实现代码如下:

<el-form :model="form" :rules="rules" label-width="80px">
      <!--省略,其他表单项-->
       <el-row class="row" v-for="(item,index) in form.bms" :key="index">
         <label for="td" class="el-form-item__label label" style="width: 80px;" :style="{visibility:index===0?'visible':'hidden'}">部门</label><!--设置动态标签,只在部门第一行显示-->
         <el-col :span="6">
          <el-form-item :prop="'bms.'+index+'.bm'"
          :rules="{
            required: true, message: '请选择部门', trigger: 'blur'
          }">
          <el-select class="input" v-model="item.bm">
            <el-option v-for="item in deptList" :key="item.name" :label="item.name" :value="item.name"></el-option>
          </el-select>
          </el-form-item>
         </el-col>
         <el-col :span="6">
          <el-form-item :prop="'bms.'+index+'.bmrs'"
          :rules="{
            required: true, message: '请输入人数', trigger: 'blur'
          }">
            <el-input class="input" v-model="item.bmrs" type="number" placeholder="人数"></el-input>
          </el-form-item>
         </el-col>
         <el-col :span="6">
          <el-form-item :prop="'bms.'+index+'.bz'">
            <el-input class="input" v-model="item.bz" placeholder="备注"></el-input>
            
          </el-form-item>
         </el-col>
         <el-col :span="1">
            <i class="el-icon-circle-plus" @click="addDept"></i>
            <i v-if="form.bms.length>1" class="el-icon-remove-outline" @click="delDept(index)"></i>
         </el-col>
       </el-row>
       <!--省略,其他表单项-->
     </el-form>

注意: for循环的key值不要使用item中的值 ,否则会导致每次输入都会重新更新视图,导致输入框没输入一个字符就会失去焦点

表单数据:

form:{
        td:"",
        bms:[{bm:"",bmrs:"",bz:""}],//默认展示一行部门数据
        rs:""
      }

动态新增与删除行的方法:

addDept(){
  this.form.bms.push({bm:"",bmrs:"",bz:""});
},
delDept(index){
  this.form.bms.splice(index,1);
}

你可以使用 Vue Element表单验证规则来实现多层循环的动态添加校验规则。下面是一个简单的示例代码,演示了如何使用 v-for 指令循环生成表单,并动态添加校验规则: ```html <template> <el-form ref="form" :model="formData" :rules="formRules" label-width="100px"> <el-form-item v-for="(item, index) in formItems" :key="index" :label="item.label" :prop="item.prop"> <el-input v-model="formData[item.prop]" :placeholder="item.placeholder"></el-input> </el-form-item> </el-form> </template> <script> export default { data() { return { formData: {}, // 表单数据 formItems: [ // 表单配置 { label: '姓名', prop: 'name', placeholder: '请输入姓名' }, { label: '年龄', prop: 'age', placeholder: '请输入年龄' }, // ... ], formRules: {} // 表单校验规则 }; }, mounted() { this.generateFormRules(); }, methods: { generateFormRules() { this.formItems.forEach(item => { // 根据不同表单生成对应的校验规则 // 这里只是示例,你可以根据实际需求进行修改 this.$set(this.formRules, item.prop, [ { required: true, message: `请输入${item.label}`, trigger: 'blur' }, // 其他校验规则... ]); }); } } }; </script> ``` 在上面的示例中,表单的配置存储在 `formItems` 数组中,你可以根据实际需求自行修改。在 `generateFormRules` 方法中,通过遍历 `formItems` 数组,动态生成表单校验规则,并将其存储在 `formRules` 对象中。最后,在 `<el-form>` 组件上使用 `:rules` 属性绑定表单校验规则。 这样,你就可以实现多层循环动态添加校验规则的功能了。记得根据实际需求修改校验规则的内容。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值