el-table 实现单元格内编辑性能

性能

双击单元格呈现编辑框,编辑框失去焦点后保留内容。

原理

  1. 通过v-if管制编辑框与显示值显示和暗藏。
  2. 通过el-table 组件·的cell-dblclick事件,失去row、column的数据,并且显示编辑框,暗藏显示值。
  3. 通过el-input组件的blur暗藏编辑框。

步骤

1.显示编辑框,聚焦编辑框

显示编辑框

column.property是以后的templateel-table-column所填写的property

row[column.property + "isShow"] = true

table数据改变时,给tablekey值一个随机数,刷新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>