vue el-table实现行内编辑功能


Posted in Javascript onDecember 11, 2019

最近做一个vue前后端分离的项目,前端框架用element ui,在 使用 el-table 的过程中,需要实现行内编辑,效果大概是这样:

vue el-table实现行内编辑功能

分为下面几个步骤:

(1) 自定义 el-table 的表头(即添加 “新增” 按钮):

<el-table :data="propTableData.col.filter(data => handleAdd || data.name.toLowerCase().includes(handleAdd.toLowerCase()))"
   highlight-current-row
   border>
</el-table>
<template slot="header"
  slot-scope="scope">
  <el-button v-model="handleAdd"
    size="mini"
    type="success"
    round
    plain
    @click="handleAdd(scope.$index, scope.row)">{{ $t('common.add') }}</el-button>
</template>

表头自定义了一个“添加”按钮,点击 el-table 动态添加一行。

(2) el-table 动态添加一行:

let row = {
  code: '',
  maxValue: '',
  minValue: '',
  name: '',
  valueType: 'String',
  id: '',
  typeId: '',
  warning: false,
  isSet: true
}
this.propTableData.col.push(row)

vue 数据变化驱动 dom 进行更新,给 table 绑定的数据 propTableData.col 添加一个元素,则表格会添加一行。

propTableData.sel 保存当前行数据:

this.propTableData.sel = row

(3) el-table 动态删除一行:

子组件中触发父组件的 delete 事件:

this.$emit('delete', row.id)

(4)当前行状态判断,即是否处于编辑状态,控制表格每一行的按钮元素的移除与插入:

<template slot-scope="scope">
   <el-button size="mini"
      type="primary"
      round
      plain
      v-if="!scope.row.isSet"
      @click="valChange(scope.row,scope.$index,true)">{{ $t('common.edit') }}</el-button>
   <el-button size="mini"
      type="primary"
      round
      plain
      v-else
      @click="valChange(scope.row,scope.$index,true)">{{ $t('common.save') }}</el-button>
   <el-button size="mini"
      type="danger"
      round
      plain
      v-if="!scope.row.isSet"
      @click="handleDelete(scope.$index, scope.row)">{{ $t('common.delete') }}</el-button>
   <el-button size="mini"
      type="danger"
      round
      plain
      v-else
      @click="valChange(scope.row,scope.$index,false)">{{ $t('common.cancel') }}</el-button>
</template>

上面代码中,通过 v-if=“scope.row.isSet” 来判断当前行是否处于编辑状态。

如果当前行处于编辑状态,则按钮为“保存”和“取消”,此时可对当前行进行保存和取消操作,且不能新增,除非先保存当前行;

如果当前行处于非编辑状态,则按钮为“编辑”和“删除”状态,此时可对当前行进行编辑和删除操作。

这样,就可以实现 el-table 行内编辑的需求。

vue el-table实现行内编辑功能

完整版代码如下:

<template>
 <el-dialog class="uiot-dialog"
    width="900px"
    :visible.sync="isShow"
    :before-close="beforeClose"
    :close-on-click-modal="false"
    :title="$t('basicData.device.propDlg.dlgTitle')"
    @open="open">
 <el-table :data="propTableData.col.filter(data => handleAdd || data.name.toLowerCase().includes(handleAdd.toLowerCase()))"
    highlight-current-row
    border>
  <el-table-column label="No."
      type="index"
      align="center"
      width="50"></el-table-column>
  <el-table-column :label="$t('basicData.device.propDlg.code')">
  <template slot-scope="scope">
   <span v-if="scope.row.isSet">
   <el-input size="mini"
      v-model="scope.row.code"></el-input>
   </span>
   <span v-else>{{ scope.row.code }}</span>
  </template>
  </el-table-column>
  <el-table-column :label="$t('basicData.device.propDlg.name')">
  <template slot-scope="scope">
   <span v-if="scope.row.isSet">
   <el-input size="mini"
      v-model="scope.row.name"></el-input>
   </span>
   <span v-else>{{ scope.row.name }}</span>
  </template>
  </el-table-column>
  <el-table-column :label="$t('basicData.device.propDlg.minValue')">
  <template slot-scope="scope">
   <span v-if="scope.row.isSet">
   <el-input size="mini"
      v-model="scope.row.minValue"></el-input>
   </span>
   <span v-else>{{ scope.row.minValue }}</span>
  </template>
  </el-table-column>
  <el-table-column :label="$t('basicData.device.propDlg.maxValue')">
  <template slot-scope="scope">
   <span v-if="scope.row.isSet">
   <el-input size="mini"
      v-model="scope.row.maxValue"></el-input>
   </span>
   <span v-else>{{ scope.row.maxValue }}</span>
  </template>
  </el-table-column>
  <el-table-column :label="$t('basicData.device.propDlg.valueType')">
  <template slot-scope="scope">
   <span v-if="scope.row.isSet">
   <el-select size="mini"
      v-model="scope.row.valueType"
      :placeholder="$t('common.pleSelect')">
    <el-option v-for="item in valTypeOptions"
       :key="item.value"
       :label="item.label"
       :value="item.value"></el-option>
   </el-select>
   </span>
   <span v-else>{{ scope.row.valueType }}</span>
  </template>
  </el-table-column>
  <el-table-column :label="$t('basicData.device.propDlg.warning')">
  <template slot-scope="scope">
   <span v-if="scope.row.isSet">
   <el-select v-model="scope.row.warning"
      size="mini">
    <el-option v-for="item in warnOptions"
       :key="item.value"
       :label="item.label"
       :value="item.value"></el-option>
   </el-select>
   </span>
   <span v-else>{{ scope.row.warning===true?'是':'否' }}</span>
  </template>
  </el-table-column>
  <el-table-column align="center"
      width="170px">
  <template slot="header"
     slot-scope="scope">
   <el-button v-model="handleAdd"
      size="mini"
      type="success"
      round
      plain
      @click="handleAdd(scope.$index, scope.row)">{{ $t('common.add') }}</el-button>
  </template>
  <template slot-scope="scope">
   <el-button size="mini"
      type="primary"
      round
      plain
      v-if="!scope.row.isSet"
      @click="valChange(scope.row,scope.$index,true)">{{ $t('common.edit') }}</el-button>
   <el-button size="mini"
      type="primary"
      round
      plain
      v-else
      @click="valChange(scope.row,scope.$index,true)">{{ $t('common.save') }}</el-button>
   <el-button size="mini"
      type="danger"
      round
      plain
      v-if="!scope.row.isSet"
      @click="handleDelete(scope.$index, scope.row)">{{ $t('common.delete') }}</el-button>
   <el-button size="mini"
      type="danger"
      round
      plain
      v-else
      @click="valChange(scope.row,scope.$index,false)">{{ $t('common.cancel') }}</el-button>
  </template>
  </el-table-column>
 </el-table>
 </el-dialog>
</template>

<script>
import { open } from 'fs'
import '@/styles/uiot.scss'

const defaultProp = {
 code: '',
 maxValue: '',
 minValue: '',
 name: '',
 valueType: 'String',
 id: '',
 typeId: '',
 warning: false
}

export default {
 props: {
 isShow: Boolean,
 oneRow: {
  type: Array,
  default: function() {
  return defaultProp
  }
 }
 },
 data() {
 return {
  propTableData: {
  sel: null, // 选中行
  col: []
  },
  warnOptions: [
  {
   value: true,
   label: '是'
  },
  {
   value: false,
   label: '否'
  }
  ],
  valTypeOptions: [
  {
   value: 'String',
   label: 'String'
  },
  {
   value: 'Int',
   label: 'Int'
  },
  {
   value: 'Double',
   label: 'Double'
  },
  {
   value: 'Boolean',
   label: 'Boolean'
  },
  {
   value: 'Date',
   label: 'Date'
  }
  ]
 }
 },
 created() {},
 methods: {
 open() {
  this.propTableData.col = this.oneRow
  this.propTableData.col.map(i => {
  i.isSet = false
  })
  console.log('open', this.propTableData.col)
 },
 // 添加
 handleAdd() {
  for (let i of this.propTableData.col) {
  if (i.isSet) {
   return this.Message(
   this.$t('basicData.device.propDlg.pleSave'),
   'warning'
   )
  }
  }
  let row = {
  code: '',
  maxValue: '',
  minValue: '',
  name: '',
  valueType: 'String',
  id: '',
  typeId: '',
  warning: false,
  isSet: true
  }
  this.propTableData.col.push(row)
  this.propTableData.sel = row
 },
 //修改
 valChange(row, index, qx) {
  console.log('edit', this.propTableData)
  //点击修改,判断是否已经保存所有操作
  for (let i of this.propTableData.col) {
  console.log('i.isSet', i.isSet, i.id, row.id)
  if (i.isSet && i.id != row.id) {
   this.Message(this.$t('basicData.device.propDlg.pleSave'), 'warning')
   return false
  }
  }
  //是否是取消操作
  if (!qx) {
  console.log('qx', this.propTableData.sel.id)
  if (!this.propTableData.sel.id) {
   this.propTableData.col.splice(index, 1)
  }
  return (row.isSet = !row.isSet)
  }
  //提交数据
  if (row.isSet) {
  console.log('this.propTableData.sel', this.propTableData.sel)
  const v = this.propTableData.sel
  // 必填项判断
  if (v.code == '' || v.name == '') { 
   this.Message(this.$t('common.pleEnter'), 'warning')
  } else {
   this.$emit('confirm', this.propTableData.sel)
   row.isSet = false
  }
  } else {
  this.propTableData.sel = row
  row.isSet = true
  }
 },
 // 删除
 handleDelete(index, row) {
  this.$emit('delete', row.id)
 },
 beforeClose() {
  this.$emit('cancel')
 },
 Message(msg, type) {
  this.$message({ type: type ? type : 'info', message: msg })
 }
 }
}
</script>

<style lang="scss">
</style>

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

Javascript 相关文章推荐
jQuery 美元符冲突的解决方法
Mar 28 Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
Sep 26 Javascript
JS刷新框架外页面七种实现代码
Feb 18 Javascript
jquery动态添加option示例
Dec 30 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
Oct 30 Javascript
详解JavaScript 中的 replace 方法
Jan 01 Javascript
深入理解js函数的作用域与this指向
May 28 Javascript
EasyUI学习之Combobox级联下拉列表(2)
Dec 29 Javascript
JS实现新建文件夹功能
Jun 17 Javascript
js中的深浅拷贝问题简析
May 10 Javascript
JS原形与原型链深入详解
May 09 Javascript
javascript实现用户必须勾选协议实例讲解
Mar 24 Javascript
Vue.js实现可编辑的表格
Dec 11 #Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
Dec 11 #Javascript
用JS实现一个简单的打砖块游戏
Dec 11 #Javascript
js消除图片小游戏代码
Dec 11 #Javascript
详解vue中$nextTick和$forceUpdate的用法
Dec 11 #Javascript
基于jQuery实现可编辑的表格
Dec 11 #jQuery
jQuery实现可编辑的表格
Dec 11 #jQuery
You might like
php 图像函数大举例(非原创)
2009/06/20 PHP
php中引用符号(&amp;)的使用详解
2013/11/13 PHP
php实现多维数组排序的方法示例
2017/03/23 PHP
vmware linux系统安装最新的php7图解
2019/04/14 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
2019/10/09 PHP
Aster vs Newbee BO5 第二场2.19
2021/03/10 DOTA
javascript getElementsByClassName 和js取地址栏参数
2010/01/02 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
jquery鼠标停止移动事件
2013/12/21 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
jQuery+AJAX实现网页无刷新上传
2015/02/22 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
Vue分页插件的前后端配置与使用
2019/10/09 Javascript
JavaScript实现网页动态生成表格
2020/11/25 Javascript
django 自定义用户user模型的三种方法
2014/11/18 Python
python 处理string到hex脚本的方法
2018/10/26 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
PyTorch预训练的实现
2019/09/18 Python
python用类实现文章敏感词的过滤方法示例
2019/10/27 Python
python标识符命名规范原理解析
2020/01/10 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
Python如何实现机器人聊天
2020/09/10 Python
python输入中文的实例方法
2020/09/14 Python
微信小程序实现可实时改变转速的css3旋转动画实例代码
2018/09/11 HTML / CSS
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
Amara美国站:英国高端家居礼品网站,世界各地的奢侈家具品牌
2017/07/26 全球购物
开会迟到检讨书
2014/01/08 职场文书
《观舞记》教学反思
2014/04/16 职场文书
给校长的一封检讨书
2014/09/20 职场文书
2014年驻村干部工作总结
2014/11/17 职场文书
《给予树》教学反思
2016/03/03 职场文书
用php如何解决大文件分片上传问题
2021/07/07 PHP
MySQL视图概念以及相关应用
2022/04/19 MySQL