问题形容

在我的项目开发中,咱们常常会遇到表单保留的性能,在表单保留前,经常须要做表单必填项的校验,校验通过当前才去发申请保留表单数据。
然而,这个表单如果是动静的,即:能够新增雷同的表单。比方这个表单有输入框和下拉框须要校验,点击增加表格按钮,再新增一个雷同的表单,同样新的这个表单对应的输入框和下拉框也须要校验。
本文记录一下对应代码写法思路,咱们先看一下效果图:

效果图

代码思路

  1. 表单的主数据是要写成对象模式 :model="ruleForm" 不过既然是要动静的,必定是要循环呢,所以,能够写成这样:
ruleForm: {        // 动静循环项数组        formItemArr: [          {            name: "",            gender: "",          },        ],      },
  1. 点击增加表格的时候,就能够间接push对应项就行啦,即,这样:
// 增加一个表格    addForm() {      let itemObj = {        name: "",        gender: "",      };      this.ruleForm.formItemArr.push(itemObj);    },
  1. 重点来喽,因为是循环的,所以prop也要变成动静的了,要拼接上index,就变成依据索引去找对应的校验项了,即为::prop="'formItemArr.' + index + '.name'" ,这样的话,就变成了:prop="formItemArr.0.name"、prop="formItemArr.1.name"、prop="formItemArr.2.name" ... 这样的话,就能够关照到每一项中的每一个绑定的值了,校验就不会漏掉
  1. 校验规定写成内联就能够触发校验函数this.$refs["ruleForm"].validate((val) => {})
<el-form-item          label="姓名"          :prop="'formItemArr.' + index + '.name'"          :rules="{            required: true,            message: '请填写',            trigger: 'blur',          }"        >        ......

残缺代码

演示的话,大家间接复制粘贴即可

<template>  <div class="box">    <el-button @click="addForm" size="mini" type="primary" plain      >增加表格</el-button    >    <el-button @click="saveForm" size="mini" type="primary" plain      >保留表格</el-button    >    <br />    <br />    <el-form      :model="ruleForm"      ref="ruleForm"      label-width="100px"      class="formform"    >      <div        class="formformItemClass"        v-for="(item, index) in ruleForm.formItemArr"        :key="index"      >        <el-form-item          label="姓名"          :prop="'formItemArr.' + index + '.name'"          :rules="{            required: true,            message: '请填写',            trigger: 'blur',          }"        >          <el-input            size="mini"            v-model.trim="item.name"            placeholder="请填写"            style="width: 200px"          ></el-input>        </el-form-item>        <el-form-item          label="性别"          :prop="'formItemArr.' + index + '.gender'"          :rules="{            required: true,            message: '请抉择',            trigger: 'change',          }"        >          <el-select            clearable            size="mini"            v-model="item.gender"            placeholder="请抉择"          >            <el-option label="男" value="男"></el-option>            <el-option label="女" value="女"></el-option>          </el-select>        </el-form-item>      </div>    </el-form>  </div></template><script>export default {  data() {    return {      ruleForm: {        // 动静循环项数组        formItemArr: [          {            name: "",            gender: "",          },        ],      },    };  },  methods: {    // 增加一个表格    addForm() {      let itemObj = {        name: "",        gender: "",      };      this.ruleForm.formItemArr.push(itemObj);    },    // 保留表格    saveForm() {      this.$refs["ruleForm"].validate((val) => {        if (val) {          console.log("符合要求,保留胜利", this.ruleForm);        } else {          console.log("error submit!!");          return false;        }      });    },  },};</script><style lang="less" scoped>.box {  width: 100%;  height: 100%;  box-sizing: border-box;  padding: 24px;  .formform {    width: 360px;    .formformItemClass {      padding-top: 24px;      border: 2px dashed #ccc;      margin-bottom: 18px;    }  }}</style>
好忘性不如烂笔头,记录一下吧 ^_^