vue+element实现表格新增、编辑、删除功能

几天前,需要做一个需求:新增一个xml文件时,添加数量不确定、属性相同的xml标签,想了想可以用表格做啊,属性相同,使用统一的表头,下面的属性值只是进行增删改不就行了,就类似于mysql给表里填数据一样。

可是目前似乎还没有表格的直接增删改一行的操作,那要怎么实现呢?于是,通过上网以及自己的思考,终于实现了,代码、思路以及效果图如下:

1 html部分:

<el-button type="success" @click="addRow(tableData)">新增</el-button>
<template>
 <el-table
  :data="tableData"
  style="width: 100%"
  max-height="250"
  @cell-dblclick="tableDbEdit">
  <el-table-column
   prop="name"
   label="name"
   width="150">
  </el-table-column>
  <el-table-column
   prop="xpath"
   label="xpath"
   width="120">
  </el-table-column>
  <el-table-column
   prop="desc"
   label="desc"
   width="120">
  </el-table-column>
  <el-table-column
   prop="value"
   label="value"
   width="120">
  </el-table-column>
  <el-table-column
   prop="defVal"
   label="defVal"
   width="300">
  </el-table-column>
  <el-table-column
   fixed="right"
   label="操作"
   width="120">
   <template slot-scope="scope">
  <el-button
   @click.native.prevent="deleteRow(scope.$index, tableData)"
   type="text"
   size="small">
   移除
  </el-button>
   </template>
  </el-table-column>
 </el-table>
</template>

2 样式部分

<style>
 .el-table .warning-row {
  background: oldlace;
 }
 .el-table .success-row {
  background: #f0f9eb;
 }
 .cell-edit-color{
     color:#2db7f5;
     font-weight: bold;
   }
  .cell-edit-input .el-input, .el-input__inner {
  width:100px;
  }
  .cell-icon{
  cursor:pointer;
  color:#fff;
   }
</style>

3.data定义:

rules: {
      fileName: [
       { required: true, message: '请输入文件路径', trigger: 'blur' }
      ],
      policyfileName: [
       { required: true, message: '请输入文件路径', trigger: 'blur' }
      ],
      parmna: [
       { required: true, message: '请输入数据字段名称', trigger: 'blur' }
      ],
      remark: [
       { required: true, message: '请输入分组类型名称', trigger: 'blur' }
      ]
     },
   activeName: 'include',
   tabPosition: 'left',
   dialogFormVisible: false,
   formQuery:[],
   serverForm: {
     fileName: '',
     policyfileName: '',//policy下的include
     scmType: '',
     version: '',
     address: ''
   },
  tableData: [{
       name: 'aa',
       xpath: 'bb',
       desc: 'cc',
       value: 'dd',
       defVal: 'ee'
      }, {
        name: 'aa1',
        xpath: 'bb1',
        desc: 'cc1',
        value: 'dd1',
        defVal: 'ee1'
}]

4 具体方法:

deleteRow(index, rows) {//移除一行
    rows.splice(index, 1);//删掉该行
   },
 addRow(tableData,event){//新增一行
 //之前一直想不到怎么新增一行空数据,最后幸亏一位朋友提示:表格新增一行,其实就是源数据的新增,从源数据入手就可以实现了,于是 恍然大悟啊!
  tableData.push({ name: '', xpath: '',desc:'',value:'',defVal:'' })
 },

tableDbEdit(row, column, cell, event) {//编辑单元格数据
//当鼠标双击单元格里面具体单元格的时候,即可对数据进行编辑操作,其实就是添加了一个输入框,最终将输入框中的数据保存下来就行了。
      event.target.innerHTML = "";
      let cellInput = document.createElement("input");
      cellInput.value = "";
      cellInput.setAttribute("type", "text");
      cellInput.style.width = "60%";
      cell.appendChild(cellInput);
      cellInput.onblur = function() {
      cell.removeChild(cellInput);
      event.target.innerHTML = cellInput.value;
      };
}

效果如下

————————分割线———————–

之前实现的都是input框的方式,昨天又做了个优化,增加了下拉框的方式,并且新增了提交表单时,能够将数据传到后端的功能。

首先我们知道,select标签的格式,比较特殊,没有input那么直接,每次只需要修改,展示它本身的value属性的值就OK了,select的标签格式如下:

<select>
<option value="volvo">Volvo</option>
<option value="saab">Saab</option>
<option value="mercedes">Mercedes</option>
<option value="audi">Audi</option>
</select>

那么, 我的修改之后的编辑方法如下:

tableDbEdit(row, column, cell, event) {
     event.target.innerHTML = "";
     let cellInput = '';
     let name = column.property.trim();//拿到当前的属性值
     //新建一个option元素
     let option = document.createElement('option')
     let option2 = document.createElement('option')
     if(name==="fildtp"){
      cellInput = document.createElement("select");
      //为option赋值和内容
      option.value="1";
      option.text="字符";
      option2.value="2";
      option2.text="数字";
      //将option元素直接添加为子元素
      cellInput.appendChild(option);
      cellInput.appendChild(option2);
      cell.appendChild(cellInput);
       cellInput.onblur = function() {
       cell.removeChild(cellInput);
       //将单元格的内容填充为所选中元素的内容,而不是值
       event.target.innerHTML = cellInput.selectedOptions[0].text;
       //将所选中元素的值赋给该行的值,每个属性都执行一次赋值,那么在最终提交表单的时候,就能保证当前表的值传到后端
       row.fildtp=cellInput.value;
      }
     }else if(name==="musttg"){
      cellInput = document.createElement("select");
      option.value="1";
      option.text="是";
      option2.value="0";
      option2.text="否";
      cellInput.appendChild(option);
      cellInput.appendChild(option2);
      cell.appendChild(cellInput);
       cellInput.onblur = function() {
       cell.removeChild(cellInput);
       event.target.innerHTML = cellInput.selectedOptions[0].text;
       row.musttg=cellInput.value;
      }
     }else if(name==="looptg"){
       cellInput = document.createElement("select");
       option.value="1";
       option.text="循环";
       option2.value="0";
       option2.text="非循环";
       cellInput.appendChild(option);
       cellInput.appendChild(option2);
       cell.appendChild(cellInput);
       cellInput.onblur = function() {
       cell.removeChild(cellInput);
       event.target.innerHTML = cellInput.selectedOptions[0].text;
       row.looptg=cellInput.value;
       };
      }else{
      debugger
       cellInput = document.createElement("input");
       cellInput.value = "";
       cellInput.setAttribute("type", "text");
       cellInput.style.width = "75%";
       cell.appendChild(cellInput);
       cellInput.onblur = function() {
       cell.removeChild(cellInput);
       event.target.innerHTML = cellInput.value;
       if(name==="fildcd"){
       row.fildcd=cellInput.value;
       }else if(name==="fildna"){
         row.fildna=cellInput.value;
       }else if(name==="fildln"){
         row.fildln=cellInput.value;
       }else if(name==="fildde"){
         row.fildde=cellInput.value;
       }else if(name==="defult"){
         row.defult=cellInput.value;
       }else if(name==="format"){
         row.format=cellInput.value;
       }else if(name==="enumcd"){
         row.enumcd=cellInput.value;
       }else if(name==="loophd"){
         row.loophd=cellInput.value;
       }else if(name==="remark"){
         row.remark=cellInput.value;
       }
      };
     }
},

这种方式,比较详细,也比较容易理解,但是总感觉有点不完美,首先新增了一行以后,必须要双击某一个单元格参能进行内容的输入,不够明显。从代码上来说,代码量也较大;而且使用的是原生的html标签,因此,我在之后对此进行了一个优化,直接使用vue的代码实现,不仅大大减少了代码量,还实现了操作的友好性。具体实现可以查看的我的文章:Vue+Element实现表格的编辑、删除、以及新增行的最优方法(Vue开发四)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • vue+element-ui实现表格编辑的三种实现方式

    1.表格内部显示和编辑切换 这种方式就是利用两个标签显示隐藏来实现,我们这里用input和span,正常用span将数据显示,点击编辑时,将span隐藏,显示input进行编辑.选中当前行我们可以通过slot-scope中的index去实现,在控制显示隐藏的属性上绑定index就可以选中当前行了,如showEdit[index]. 页面结构代码: <el-table :data="tableData" tooltip-effect="dark" style=&

  • vue+iview 实现可编辑表格的示例代码

    先简单说明一下,这个Demo引入的vue,iview的方式是标签引入的,没有用到webpack之类的构建工具... 毕竟公司还在用angularjs+jq. 这也是我第一次写文章,大家看看思路就行了,要是有大佬指点指点就更好了 话不多说,先来个效果图 我们再看下极为简单的目录结构 IViewEditTable ## vue+iview 实现的可编辑表格 └── index.html ## 首页 └── js └── editTable.js ## 首页JS └── ivew ## iview相关

  • 对Vue table 动态表格td可编辑的方法详解

    项目中需求用到可编辑表格 下图这种 ↓ element UI 组件table表格中 增加template 模版 翻入input 根据业务逻辑增加全局变量 isEdit 是否变化. <el-table-column label="名称" width="140"> <template scope="scope"> <el-input v-if="scope.row.isEdit && scope

  • vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例

    如果是已经有点经验的同学,可以直接看下面这个函数,应该就能明白怎么回事,新手可以看下面的详细教程. 函数: handleEdit: function (index, row) { this.editFormVisible = true; this.editForm = Object.assign({}, row); } 详细教程: 1.首先,做一个表格,用于显示信息:代码如下: <el-table :data="users" highlight-current-row v-loa

  • Vue封装的可编辑表格插件方法

    可任意合并表头,实现单元格编辑. 页面效果如图: 页面使用如下: <template> <div> <v-table :datat = "tableData" :thlabel="thlabel" :isEdit="true"> </v-table> </div> </template> <script> export default{ data(){ retur

  • VUE+Element UI实现简单的表格行内编辑效果的示例的代码

    原理是通过Css控制绑定的输入控件与显示值,在选中行样式下对控件进行隐藏或显示 效果示例地址 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!-- 引入样式 --> <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-default/index.c

  • vue+element的表格实现批量删除功能示例代码

    最近写了一个批量删除功能,遇到了不少坑,特此记录一下 表格的代码如下 复制代码 代码如下: <el-table @row-click="handleCurrentChange" @selection-change="selsChange" ref="table" :data="pageData" stripe :default-sort="{prop: 'createAt', order: 'descendin

  • vue+element实现表格新增、编辑、删除功能

    几天前,需要做一个需求:新增一个xml文件时,添加数量不确定.属性相同的xml标签,想了想可以用表格做啊,属性相同,使用统一的表头,下面的属性值只是进行增删改不就行了,就类似于mysql给表里填数据一样. 可是目前似乎还没有表格的直接增删改一行的操作,那要怎么实现呢?于是,通过上网以及自己的思考,终于实现了,代码.思路以及效果图如下: 1 html部分: <el-button type="success" @click="addRow(tableData)"&

  • 使用Bootstrap和Vue实现用户信息的编辑删除功能

    使用Bootstrap实现简单的布局,并结合Vue进行用户信息的编辑删除等功能,代码如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>用户信息编辑</title> <link rel="stylesheet" type="text/css" href="bootstrap.min.cs

  • 使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能

    一.写在前面 1. Bootstrap是一个由 Twitter 开发和维护的前端框架,目前很受欢迎,Bootstrap中文网点击这里. 2. Vue.js 是一套构建用户界面的渐进式框架,点这里访问官网. 二.实现效果: 三.页面引入bootstrap.vue资源 <link rel="stylesheet" href="//cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.css" rel="e

  • vue element实现表格增加删除修改数据

    本文实例为大家分享了vue element实现表格增加删除修改数据的具体代码,供大家参考,具体内容如下 这里用到是设置一个弹出框来实现此功能,还有一种方法是直接在原来的基础上面进行修改 效果如下: 表格的table: <el-table :data="tableData" style="width: 100%"> <el-table-column prop="date" label="日期" width=&q

  • layui加载表格,绑定新增,编辑删除,查看按钮事件的例子

    使用layui框架的时候,总会重复的写相关代码,感觉很是苦恼,所以进行分装,只需要关注业务方面即可 如下图,提供新增,编辑,查看等功能 js方法 /** * 页面内弹出编辑窗口 //需要引入 layui.js layui.css文件 * @param {} title 标题 不显示为false * @param {} area 大小 ["400px","500px"] 或者 "400px"--->只设置宽度 * @param {} path

  • springboot vue接口测试前后端树节点编辑删除功能

    目录 基于springboot+vue 的测试平台开发 一.编辑功能 1. 编辑页外显 2. 实现后端接口 3. 前后联调 4. 测试 二.删除功能 1. 后端接口 2. 前端实现 3. 测试 基于springboot+vue 的测试平台开发 继续更新. 一.编辑功能 1. 编辑页外显 点击树节点的编辑按钮,打开对话框,展示原有的节点名称. 本来树形控件里没有自带的编辑操作,我直接加了一个按钮在上面,绑定点击事件调用edit(data)方法. 为了确认 data 可用,我在edit方法中打印了一

  • Vue element商品列表的增删改功能实现

    目录 介绍 基本信息 上传主图 商品信息vue富文本编辑器的配置 最后提交数据 介绍 整体和用户列表 类似 功能步骤有: 面包屑导航 外部是大的卡片组件 搜索商品 添加商品 表格渲染数据 作用域插槽用于 操作按钮 分页器组件的使用 不一样的点:之前编辑信息 新增信息是 弹出对话框编辑 但商品信息内容较多 我们跳转到一个组件.并且进行商品编辑的时候要进行路由传参 来渲染初始数据 点击添加商品按钮时跳转到新增商品组件对应路径: addGoods(){ this.$router.push('/good

  • Angular实现较为复杂的表格过滤,删除功能示例

    本文实例讲述了Angular实现较为复杂的表格过滤,删除功能.分享给大家供大家参考,具体如下: 先来看看运行效果: 具体代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>www.jb51.net Angular过滤.删除</title> <style> table{ border: 1px solid black; w

  • 利用vue + element实现表格分页和前端搜索的方法

    前言 ElementUI是饿了么前端开源的一个基于Vue的前端框架,已经帮我们封装好了一系列功能性的组件,比如栅格系统.表格.表单.树形菜单.通知等.对于搞后台管理界面的项目,特别是不需要考虑兼容ie8.ie9以下的项目.ElementUI是一个不错的选择. 而且ElementUI的文档写得十分详尽,参照demo可以很快上手. 本文主要介绍了关于vue + element实现表格分页和前端搜索的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 实现思路 1.前端后台管理

随机推荐