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

原创/朱季谦

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

简化的页面效果图如下:

image

最开始,我是用了纯粹的表格形式,后来发现,这种形式在提交的时候,不好对每个输入框做校验,若是表单形式话,就可以直接通过rule设置每个输入框的验证,因此,我就在表格里面嵌套了表单。注意一点是,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>

完成以上步骤,就可以快速写出一个基于Vue + Element ui 实现动态表单,包括新增行/删除行/动态表单验证/提交功能的逻辑。

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue Element UI实现评论功能需要依赖一些组件,如表单、输入框、按钮、弹窗等。下面是一个简单的评论功能实现步骤: 1. 引入Element UI组件库 在Vue项目中,可以通过npm安装Element UI组件库,并在main.js文件中引入。 ``` npm install element-ui --save import Vue from 'vue'; import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; Vue.use(ElementUI); ``` 2. 创建评论组件 在Vue组件中,可以创建一个评论组件,用于显示评论列表和评论表单。在该组件中,需要定义data属性,用于存储评论列表和表单数据。 ``` <template> <div> <div v-for="comment in comments" :key="comment.id">{{comment.content}}</div> <el-form :model="form" label-position="left" label-width="80px" inline> <el-form-item label="评论"> <el-input v-model="form.content" placeholder="请输入评论内容"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="addComment">发表评论</el-button> </el-form-item> </el-form> </div> </template> <script> export default { data() { return { comments: [], form: { content: '' } } }, methods: { addComment() { const comment = { id: Date.now(), content: this.form.content } this.comments.push(comment) this.form.content = '' } } } </script> ``` 在上面的代码中,el-form表示表单el-input表示输入框,el-button表示按钮。comments数组用于存储评论列表,form对象用于存储表单数据。addComment方法用于发表评论,将表单数据存储到comments数组中,并清空表单数据。 3. 在父组件中使用评论组件 在父组件中使用评论组件,并将评论列表传递给该组件。 ``` <template> <div> <comment :comments="comments"></comment> </div> </template> <script> import Comment from './Comment.vue' export default { data() { return { comments: [ {id: 1, content: '这是一条评论'}, {id: 2, content: '这是另一条评论'} ] } }, components: { Comment } } </script> ``` 在上面的代码中,comment组件通过属性comments获取评论列表,并在父组件中定义comments数组,存储评论数据。 4. 给评论组件添加弹窗 在评论组件中,可以添加一个弹窗组件,用于提示评论成功。 ``` <template> <div> <div v-for="comment in comments" :key="comment.id">{{comment.content}}</div> <el-form :model="form" label-position="left" label-width="80px" inline> <el-form-item label="评论"> <el-input v-model="form.content" placeholder="请输入评论内容"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="addComment">发表评论</el-button> </el-form-item> </el-form> <el-dialog title="提示" :visible.sync="dialogVisible"> <p>评论成功!</p> </el-dialog> </div> </template> <script> export default { data() { return { comments: [], form: { content: '' }, dialogVisible: false } }, methods: { addComment() { const comment = { id: Date.now(), content: this.form.content } this.comments.push(comment) this.form.content = '' this.dialogVisible = true setTimeout(() => { this.dialogVisible = false }, 2000) } } } </script> ``` 在上面的代码中,el-dialog表示弹窗,dialogVisible属性用于控制弹窗的显示/隐藏。在addComment方法中,添加评论成功后,弹出评论成功的提示,并在2秒后关闭弹窗。 这就是一个简单的Vue Element UI评论功能实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱季谦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值