Vue+Element实现表格单元格编辑

 更新时间:2022年04月12日 10:43:51   作者:TYicor  
这篇文章主要为大家详细介绍了Vue+Element实现表格单元格编辑,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

Element的表格组件并没有给出明确的点击单个单元格进行的编辑的方案,我仔细阅读了官方的文档后,发现这个操作还是可以实现的。

实现原理

1、利用Table组件的cell-click属性,可以获取当前点击的单元格列对应的Dom元素。
2、清空所有的名为current-cell的class属性。
3、为当前获取的单元格Dom动态添加名为current-cell的class属性。
4、控制单元格的input标签的显示隐藏就能实现表格的编辑功能。

代码实现

<template>
  <div class="tableDiv">
    <el-table :data="tableData" highlight-current-row @cell-click="cellClick">
      <el-table-column
        v-for="(item, index) in tableColumn"
        :key="index"
        :prop="item.prop"
        :label="item.label"
        :width="item.width"
      >
        <template slot-scope="scope">
          <el-input
            v-if="item.edit"
            size="small"
            ref="tableInput"
            v-model="scope.row[item.prop]"
            @blur="removeClass"
            @change="handleEdit(item.prop, scope.$index, scope.row)"
          ></el-input>
          <span>{{ scope.row[item.prop] }}</span>
        </template>
        <el-table-column
          v-for="(itemchild, indexchild) in item.children"
          :key="indexchild"
          :prop="itemchild.prop"
          :label="itemchild.label"
          :width="itemchild.width"
        >
          <template slot-scope="scope">
            <el-input
              v-if="itemchild.edit"
              size="small"
              ref="tableInput"
              v-model="scope.row[itemchild.prop]"
              @blur="removeClass"
              @change="handleEdit(itemchild.prop, scope.$index, scope.row)"
            ></el-input>
            <span>{{ scope.row[itemchild.prop] }}</span>
          </template>
        </el-table-column>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
import { Column, tableData } from "./tableColumn";
export default {
  data() {
    return {
      tableData: tableData,
      tableColumn: Column
    };
  },
  methods: {
    handleEdit() {},
    cellClick(row, column, cell, event) {
      for(let i=0;i<document.getElementsByClassName('current-cell').length;i++){
        document.getElementsByClassName('current-cell')[i].classList.remove('current-cell');
      }
      cell.classList.add("current-cell");
    },
    removeClass(){
      document.getElementsByClassName('current-cell')[0].classList.remove('current-cell');
    }
  }
};
</script>
<style scoped>
.tableDiv .el-input {
  display: none;
}
.current-cell .el-input {
  display: block;
}
.current-cell .el-input + span {
  display: none;
}
</style>

tableColumn.js文件

const Column = [
    { label: '项目名称', prop: 'itemName', width: '300', key: '100' },
    { label: '项目编码', prop: 'itemCode', width: '150', key: '200' },
    { label: '单位', prop: 'compName', width: '150', key: '300', edit: true },
    {
        label: '费用', prop: '', width: '450', align: 'center', key: '400', children: [
            { label: '人工费', prop: 'staff', width: '150', key: '401', edit: true },
            { label: '资料费', prop: 'material', width: '150', key: '402', edit: true },
            { label: '场地费', prop: 'site', width: '150', key: '403' }
        ]
    }
];
const tableData = [
    { itemName: "北京水立方", itemCode: "1351157698", compName: "北京", staff: "100", material: "84547", site: "6544", sort: 1 },
    { itemName: "北京水立方", itemCode: "1351157698", compName: "北京", staff: "100", material: "84547", site: "6544", sort: 2 },
    { itemName: "北京水立方", itemCode: "1351157698", compName: "北京", staff: "100", material: "84547", site: "6544", sort: 3 },
    { itemName: "北京水立方", itemCode: "1351157698", compName: "北京", staff: "100", material: "84547", site: "6544", sort: 4 },
    { itemName: "北京水立方", itemCode: "1351157698", compName: "北京", staff: "100", material: "84547", site: "6544", sort: 5 },
    { itemName: "北京水立方", itemCode: "1351157698", compName: "北京", staff: "100", material: "84547", site: "6544", sort: 6 },
    { itemName: "北京水立方", itemCode: "1351157698", compName: "北京", staff: "100", material: "84547", site: "6544", sort: 7 },
    { itemName: "北京水立方", itemCode: "1351157698", compName: "北京", staff: "100", material: "84547", site: "6544", sort: 8 },
    { itemName: "北京水立方", itemCode: "1351157698", compName: "北京", staff: "100", material: "84547", site: "6544", sort: 9 },
    { itemName: "北京水立方", itemCode: "1351157698", compName: "北京", staff: "100", material: "84547", site: "6544", sort: 10 }
]
export {
    Column, tableData
}

注意:注意相应的样式不能少,非常重要!!!

页面效果:

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

相关文章

  • vue轮播图插件vue-awesome-swiper的使用代码实例

    vue轮播图插件vue-awesome-swiper的使用代码实例

    本篇文章主要介绍了vue轮播图插件vue-awesome-swiper的使用代码实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Vue组件库发布到npm详解

    Vue组件库发布到npm详解

    本片文章给大家详细介绍了如何将Vue组件库发布到npm的方法以及代码示例分享,感兴趣的朋友参考学习下。
    2018-02-02
  • Vue3源码分析组件挂载初始化props与slots

    Vue3源码分析组件挂载初始化props与slots

    这篇文章主要为大家介绍了Vue3源码分析组件挂载初始化props与slots实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • vue+elementUi中的table实现跨页多选功能(示例详解)

    vue+elementUi中的table实现跨页多选功能(示例详解)

    最近在开发工业品超市的后台系统,遇到一个需求,就是实现在一个table表格中多选数据,在网上查了好多,有些方法真的是无语,下面通过本文给大家分享vue+elementUi中的table实现跨页多选功能,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • vue中如何自定义右键菜单详解

    vue中如何自定义右键菜单详解

    这篇文章主要给大家介绍了关于vue中如何自定义右键菜单的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • vue3.2 Composition API项目依赖升级

    vue3.2 Composition API项目依赖升级

    这篇文章主要为大家介绍了vue3.2 Composition API项目依赖升级示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Vue环境搭建+VSCode+Win10的详细教程

    Vue环境搭建+VSCode+Win10的详细教程

    这篇文章主要介绍了Vue环境搭建+VSCode+Win10,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • vue中如何获取当前路由地址

    vue中如何获取当前路由地址

    这篇文章主要介绍了vue中如何获取当前路由地址,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Vue修饰符的使用详解

    Vue修饰符的使用详解

    为了方便大家写代码,Vue给大家提供了很多方便的修饰符,比如我们经常用到的取消冒泡,阻止默认事件等等,这篇文章将给大家分享Vue 中的常用的修饰符
    2022-10-10
  • vue2中filter()的实现代码

    vue2中filter()的实现代码

    vue2.0里,不再有自带的过滤器,需要自己定义过滤器。下面通过实例代码给大家介绍vue2中filter()的相关知识,感兴趣的朋友一起看看吧
    2017-07-07

最新评论