首页前端开发VUEVue + Element ui 实现动态表单,包括新增行/删除行/动态表单验证/提交功能

Vue + Element ui 实现动态表单,包括新增行/删除行/动态表单验证/提交功能

时间2023-10-22 20:07:02发布访客分类VUE浏览325
导读:总结/朱季谦最近通过Vue + Element ui实现了动态表单功能,该功能还包括了动态表单新增行、删除行、动态表单验证、动态表单提交功能,趁热打铁,将开发心得记录下来,方便以后再遇到类似功能时,直接拿来应用。简化的页面效果图如下:最开始...

总结/朱季谦

最近通过Vue + Element ui实现了动态表单功能,该功能还包括了动态表单新增行、删除行、动态表单验证、动态表单提交功能,趁热打铁,将开发心得记录下来,方便以后再遇到类似功能时,直接拿来应用。

简化的页面效果图如下:

最开始,我是用了纯粹的el-table> 表格形式,后来发现,这种形式在提交的时候,不好对每个输入框做校验,若是el-form> 表单形式话,就可以直接通过rule设置每个输入框的验证,因此,我就在el-table> 表格里面嵌套了el-form> 表单。注意一点是,el-form-item里的 :prop="scope.$index + '.name'"需要对应el-input的 v-model="studentData[scope.$index].name",两者都是同一个字段值。

template>
    
  div >
    
        div>
    
          div>
    
            el-button  size="small"  @click="addRow">
    新增/el-button>
    
          /div>
    
          !--设置的表单-->
    
          el-form :model="studentData" ref="data" label-width="auto">

          el-table
            border
            :header-cell-style="{
 'text-align': 'center' }
"
            :cell-style="{
 'text-align': 'center' }
    "
            :data="studentData"
            ref="table"
            style="width: 100%"
          >
    
​
            el-table-column align="center"   label="姓名">
    
              template slot-scope="scope">
    
              !--表格里面嵌套表单-->

                el-form-item
                  :prop="scope.$index + '.name'"
                  :rules="{
 required: true, message: '姓名不能为空', trigger: 'blur' }
    "
                >
    
                el-input
                  v-model="studentData[scope.$index].name"
                  autocomplete="off"
                  size="small"
                  placeholder="姓名"
                >
    /el-input>
    
                /el-form-item>
    
              /template>
    
            /el-table-column>
    
​
            el-table-column align="center"  label="年龄">
    
              template slot-scope="scope">

                  el-form-item
                    :prop="scope.$index + '.age'"
                    :rules="{
 required: true, message: '年龄不能为空', trigger: 'blur' }
    "
                  >
    
                el-input
                  v-model="studentData[scope.$index].age"
                  autocomplete="off"
                  size="small"
                  type='number'
                  placeholder="收款方开户行号"
                >
    /el-input>
    
                  /el-form-item>
    
              /template>
    
            /el-table-column>
    
​
            el-table-column align="center"  label="性别">
    
              template slot-scope="scope">

                el-form-item
                  :prop="scope.$index + '.sex'"
                  :rules="{
 required: true, message: '性别不能为空', trigger: 'blur' }
    "
                >
    
                el-input
                  v-model="studentData[scope.$index].sex"
                  autocomplete="off"
                  size="small"
                  placeholder="性别"
                >
    /el-input>
    
                /el-form-item>
    
              /template>
    
            /el-table-column>
    
​
            el-table-column fixed="right" label="操作" width="100">
    
              template slot-scope="scope">
    
                el-button
                  @click="handleDeleteRow(studentData[scope.$index])"
                  type="text"
                  size="small"
                >
    删除/el-button
                >
    
              /template>
    
            /el-table-column>
    
            
          /el-table>
    
          /el-form>
    
        /div>
    
        
        div slot="footer" class="dialog-footer" style="margin-bottom: 10px">
    
          el-button size="mini"  @click="submit">
    提交/el-button>
    
          el-button size="mini" @click="resetForm()">
    重置/el-button>
    
        /div>
    
  /div>
    
/template>

定义一个存储动态表格数据的数组变量

export default {

  data() {

    return {

      studentData:[],
    }
    ;

  }
,
  ......
}

在methods方法里增加相关方法,分别是新增行、删除行、提交——

methods:{

​
  /**
   * 新增行
   */
  addRow() {
    
    let index = this.studentData.length ;

    this.studentData.push({

      key: index,
      name:'',
      age:'',
      sex:'',
    }
    );

  }
,
​
  /**
   * 删除行
   * @param row
   */
  handleDeleteRow(row){
    
    let datas = this.studentData;
    
    for (var i = 0;
     i  datas.length;
 i++){

      if (datas[i].key == row.key){
    
        datas.splice(i,1);

      }

    }

  }
,
​
  /**
   * 提交
   */
  submit() {
    
    this.$refs["data"].validate(valid =>
 {

      //valid为true,表示表单都已经验证通过,若为false,说明存在表单验证失败
        if (valid) {
    
          save(this.studentData).then(response =>
 {

            this.$message({

              message: '提交成功',
              type: 'success'
            }
    );

          }
    );

        }

    }
    );

  }
,
​
  /**
   * 重置
   */
  resetForm() {
    
    let datas = this.studentData;
    
    for (var i = 0;
     i  datas.length;
 i++){
    
      datas[i].name='';
    
      datas[i].age='';
    
      datas[i].sex='';

    }

  }
,
}

设置表单验证规则,可统一在rules设置,也可以在每一输入框单独设置,我这里是单独在每一个输入框里设置,即:rules="{ required: true, message: '姓名不能为空', trigger: 'blur' } "就可以了,当然,还可以做一些更复杂的自定义规则。

el-table-column align="center"   label="姓名">
    
          template slot-scope="scope">
    
          !--表格里面嵌套表单-->

            el-form-item
              :prop="scope.$index + '.name'"
              :rules="{
 required: true, message: '姓名不能为空', trigger: 'blur' }
    "
            >
    
            el-input
              v-model="studentData[scope.$index].name"
              autocomplete="off"
              size="small"
              placeholder="姓名"
            >
    /el-input>
    
            /el-form-item>
    
          /template>
    
        /el-table-column>
    

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Vue + Element ui 实现动态表单,包括新增行/删除行/动态表单验证/提交功能
本文地址: https://pptw.com/jishu/506326.html
gin使用embed打包html python: BytesIO 中 read 用法

游客 回复需填写必要信息