实现表格可编辑
参考:el-table 中实现表格可编辑_el表格编辑_快乐征途的博客-CSDN博客
按行保存数据,每行数据最后都有一个保存按钮,如下图所示
使用的是<template>嵌套<el-input>
完整代码如下:
<template> <div> <el-table :data="tableData" size="mini" style="width: 600px" @cell-click="handleCellClick" > <el-table-column prop="date" label="日期" width="180"> <template class="item" slot-scope="scope"> //初始页面先将input隐藏(display:none)显示txt <el-date-picker type="date" value-format="yyyy-MM-dd" placeholder="选择日期" class="item__input" v-model="scope.row.date" style="display:none;"></el-input> <div class="item__txt">{{scope.row.date}}</div> </template> </el-table-column> <el-table-column prop="name" label="姓名" width="180"> <template class="item" slot-scope="scope"> <el-input class="item__input" v-model="scope.row.name" placeholder="请输入姓名" style="display:none;"></el-input> <div class="item__txt">{{scope.row.name}}</div> </template> </el-table-column> </el-table> </div> </template> <script> export default { data () { return { // 表格数据 tableData: [{ id: 0, date: '2016-05-02', name: '王小虎' }, { id: 1, date: '2016-05-04', name: '王小虎' }, { id: 2, date: '2016-05-01', name: '王小虎' }, { id: 3, date: '2016-05-03', name: '王小虎' }], // 需要编辑的属性 editProp: ['date', 'name'], // 保存进入编辑的cell clickCellMap: {} } }, methods: { /** 点击cell */ handleCellClick (row, column, cell, event) { //property是该列绑定的字段名称,若是日期列,则property是date const property = column.property if (this.editProp.includes(property)) { // 保存cell,cell是指具体点击的表格中的单元格 this.saveCellClick(row, cell) //querySelector() 方法返回文档中匹配指定 CSS 选择器的一个元素。参数是必填项 //隐藏txt显示input输入框 cell.querySelector('.item__txt').style.display = 'none' cell.querySelector('.item__input').style.display = 'block' //该单元格的input获得焦点 cell.querySelector('input').focus() } }, /** 保存进入编辑的cell */ //将进入编辑的cell存入clickCellMap数组中,后面取消编辑状态的时候遍历此数组就可以了 saveCellClick (row, cell) { const id = row.id if (this.clickCellMap[id] !== undefined) { if (!this.clickCellMap[id].includes(cell)) { this.clickCellMap[id].push(cell) } } else { this.clickCellMap[id] = [cell] } }, /** 保存数据(这部分内容可以添加到保存按钮中) */ save (row) { const id = row.id // 取消本行所有cell的编辑状态 this.clickCellMap[id].forEach(cell => { this.cancelEditable(cell) }) this.clickCellMap[id] = [] }, /** 取消编辑状态 */ cancelEditable (cell) { cell.querySelector('.item__txt').style.display = 'block' cell.querySelector('.item__input').style.display = 'none' }, } } </script>
是否可编辑权限设置
此时,我的表格数据中有一个字段是创建人,若该条数据不是当前系统登陆的用所创建的,则当前用户没有权限编辑此条数据,也就是说用户只能编辑自己创建的那条数据。
需要添加如下代码:
data(){ return{ username:'', tableDisabled:false } }, created(){ this.getUserName() }, methods:{ getUserName(){ //若该系统login页面使用的是localStorage存储的用户信息,先打印看一下localStorage然后再获取相应字段 this.username = localStorage.getItem("username") }, /** 点击cell */ handleCellClick (row, column, cell, event) { const us = row.createUser; if(this.username == us){ this.tableDisabled = true; }else{ this.tableDisabled = false; } if(!this.tableDisabled){ this.$message.warning("您无权限更改此条数据") }else{ const property = column.property if (this.editProp.includes(property)) { this.saveCellClick(row, cell) cell.querySelector('.item__txt').style.display = 'none' cell.querySelector('.item__input').style.display = 'block' cell.querySelector('input').focus() } } }, }
表格点击下一页以后隐藏input
若当前页的表格没有点击保存按钮将input输入框隐藏,直接点击别的页面,那么别的页面input输入框的显示状态和之前页面是一样的,这样可能会导致该页面数据不是该用户创建的,但是那条数据缺显示了可编辑的输入框。
导致如上bug的原因是:根据cell设置的input的状态,但是分页了以后,第一页和第二页相同的单元格都显示input。比如:我点击左上角的单元格显示输入框,当进入下一页的时候,左上角的输入框同样是显示的状态。
现在,需要点击分页进入别的页面之前,将所有的input输入框隐藏。
在表格分页条的current-change事件中添加代码:
currentChangeHandle(val){ this.pageNum = val; let id = '' //此时tableData的数据还是之前的页面数据还未更新 for(let i=0;i<this.tableData.length;i++){ id = this.tableData[i].id; //如果当前行不存在input显示,this.clickCellMap[id]是undefined if(this.clickCellMap[id] !==undefined){ //取消cell编辑状态,显示txt this.clickCellMap[id].forEach(cell=>{ //此方法在最上面的代码中写了 this.cancelEditTable(cell); }) this.clickCellMap[id] = [] } } //调用后端接口更新表格数据 this.getList() }