el-table 实现单元格内编辑性能
性能
双击单元格呈现编辑框,编辑框失去焦点后保留内容。
原理
- 通过
v-if
管制编辑框与显示值显示和暗藏。 - 通过
el-table
组件·的cell-dblclick
事件,失去row、column
的数据,并且显示编辑框,暗藏显示值。 - 通过
el-input
组件的blur
暗藏编辑框。
步骤
1.显示编辑框,聚焦编辑框
显示编辑框
column.property
是以后的template
中el-table-column
所填写的property
值
row[column.property + "isShow"] = true
table
数据改变时,给table
的key
值一个随机数,刷新table
。
this.randomKey = Math.random()
编辑框聚焦
this.$nextTick
是为了确保ref
存在后执行下列代码
this.$nextTick(() => { this.$refs[column.property] && this.$refs[column.property].focus()})
2.编辑框失去焦点,暗藏编辑框
row[column.property + "isShow"] = false
残缺代码
<template> <div> <el-table :data="items" :key="randomKey" @cell-dblclick="editData" style="width: 100%"> <el-table-column label="日期" property="date" width="140"> <template slot-scope="scope"> <el-input v-if="scope.row[scope.column.property + 'isShow']" :ref="scope.column.property" v-model="scope.row.date" @blur="alterData(scope.row,scope.column)"></el-input> <span v-else>{{ scope.row.date }}</span> </template> </el-table-column> <el-table-column label="程序" property="id" width="140"> <template slot-scope="scope"> <el-input v-if="scope.row[scope.column.property + 'isShow']" :ref="scope.column.property" v-model="scope.row.id" @blur="alterData(scope.row,scope.column)"></el-input> <span v-else>{{ scope.row.id }}</span> </template> </el-table-column> </el-table> </div></template><script>export default { data () { return { items: [ { date: '2016-05-03', id: '0' }, { date: '2016-05-04', id: '1' }, { date: '2016-05-05', id: '2' }, { date: '2016-05-06', id: '3' }, ], randomKey: Math.random(), } }, methods: { editData (row, column) { row[column.property + "isShow"] = true //refreshTable是table数据改变时,刷新table的 this.refreshTable() this.$nextTick(() => { this.$refs[column.property] && this.$refs[column.property].focus() }) }, alterData (row, column) { row[column.property + "isShow"] = false this.refreshTable() }, refreshTable () { this.randomKey = Math.random() }, }}</script>