el-table动态添加行,列。自定义输入表头,input hover 显示文字

2023-10-27

功能点:

1,动态添加行
2,动态添加列
3,右键表头删除列
4,右键表体删除行
5,表格hover提示当前单元格文字,自动换行
6,表头文字自定义
7,表头,添加按钮固定,表体自适应滚动

效果图:
在这里插入图片描述

代码:复制即可运行

<template>
  <div class="app-container haplotype-detail default-scrollbar">
    <div>
      <el-form ref="historyForm" :model="historyForm" size="small">
        <div class="table-box" @contextmenu.prevent.capture style="display:flex;">
          <el-table
            :header-cell-style="{background:'#f2f2f2'}"
            :data="historyForm.tableData"
            :loading="loading"
            style="width: 97%;"
            class="list-table default-scrollbar"
            size="mini"
            @header-contextmenu="rightClickColShowFun"
            @row-contextmenu="rightClickRowShowFun"
            :cell-class-name="tableClassName"
            :height="elTableHeight"
            border>
            <el-table-column label="序号" align="center" width="50">
              <template slot-scope="scope">
                {{scope.$index+1}}
              </template>
            </el-table-column>
             <el-table-column  v-for="(item,index) in historyForm.tableHeader" :key="index"  align="center" :prop="item.nameEn" class-name="cellDefault">
               <template  slot="header" slot-scope="scope">
                  <el-tooltip  effect="light" placement="bottom" trigger ="hover" :disabled="item.name?false:true">
                       <div slot="content" style="max-width:200px;">{{item.name}}</div>
                       <el-input style="background:#ddd" class="headerBox" v-model="item.name"  @change="setColName(index,historyForm.tableHeader[index].name)"/>
                    </el-tooltip>
                </template>
              <template slot-scope="scope">
                  <el-tooltip  effect="light" placement="bottom" trigger ="hover" :disabled="scope.row[item.nameEn]?false:true">
                       <div slot="content" style="max-width:200px;">{{scope.row[item.nameEn]}}</div>
                       <el-input v-model="scope.row[item.nameEn]" @input="setInputVal" class="name-input"></el-input>
                  </el-tooltip>
              </template>
            </el-table-column>
          </el-table>
           <div class="add-column" @click="addColSetting">+</div>
        </div>
        
        <div class="add-line" @click="addParamsSetting">+</div>
      </el-form>
    </div>
  </div>
</template>
<script>
export default {
  name: "haplotypeDetail",
  data() {
    return {
      elTableHeight:0,
      // 遮罩层
      loading: true,
      // 表单参数-表格内容数据
      historyForm: {
        // 表头列表数组
        tableHeader:[
           {
            name:'类型(自属性)',
            nameEn:'typeSelf'
           },
            {
            name:'类型(生产属性)',
            nameEn:'typeProduct'
           },
            {
            name:'类型(设备属性)',
            nameEn:'typeEquipment'
           },
            {
            name:'类型(质量追溯属性)',
            nameEn:'typeQuality'
           }
        ],
        tableData: [
            {index:0,typeSelf:'集团',typeProduct:'',typeEquipment:'',typeQuality:''},
            {index:1,typeSelf:'公司',typeProduct:'',typeEquipment:'',typeQuality:''},
            {index:2,typeSelf:'厂区',typeProduct:'厂区',typeEquipment:'厂区',typeQuality:'厂区'},
            {index:3,typeSelf:'车间',typeProduct:'车间',typeEquipment:'车间',typeQuality:'车间'},
            {index:4,typeSelf:'线体',typeProduct:'线体',typeEquipment:'线体',typeQuality:'线体'},
            {index:5,typeSelf:'工艺区',typeProduct:'工艺区',typeEquipment:'工艺区',typeQuality:'工艺区'},
            {index:6,typeSelf:'PLC区',typeProduct:'PLC区',typeEquipment:'PLC区',typeQuality:'PLC区'},
            {index:7,typeSelf:'安全区',typeProduct:'安全区',typeEquipment:'安全区',typeQuality:'安全区'},
            {index:8,typeSelf:'工位',typeProduct:'工位',typeEquipment:'工位',typeQuality:'工位'},
            {index:9,typeSelf:'设备组',typeProduct:'设备组',typeEquipment:'设备组',typeQuality:'设备组'},
            {index:10,typeSelf:'设备',typeProduct:'设备',typeEquipment:'设备',typeQuality:'设备'},
            {index:11,typeSelf:'附属设备LV1',typeProduct:'附属设备LV1',typeEquipment:'附属设备LV1',typeQuality:'附属设备LV1'},
            {index:12,typeSelf:'附属设备LV2',typeProduct:'附属设备LV2',typeEquipment:'附属设备LV2',typeQuality:'附属设备LV2'},
            {index:13,typeSelf:'附属设备LV3',typeProduct:'附属设备LV3',typeEquipment:'附属设备LV3',typeQuality:'附属设备LV3'},
        ]
      },
      isAddCol: true,
      currentClickRow: null,
      currentClickCol: null,
    };
  },
  mounted: function () {
    // 高度调整
      this.$nextTick(() => {
        this.elTableHeight = document.body.clientHeight-130;
        console.log(document.body.clientHeight)
        console.log(this.elTableHeight)
      });
  },
  methods: {
    // 新增行
    addParamsSetting () {
      let item = {
        typeEquipment: "",
        typeProduct: "",
        typeQuality: "",
        typeSelf: ""
      };
      for (let i in this.historyForm.tableHeader) {
        if(i>3){
         item[this.historyForm.tableHeader[i].nameEn] = '';
        }
      }
      this.historyForm.tableData.push(item);
      console.log(this.historyForm.tableData)
    },
    // 删除当前行
    deleteRow (index) {
      this.historyForm.tableData.splice(index, 1)
    },
    // 在数据最后新增一列
    addColSetting() {
      for (let i in this.historyForm.tableHeader) {
        if (this.historyForm.tableHeader[i].name === "") {
          this.isAddCol = false;
        }else {
          this.isAddCol = true;
        }
      }
      if (this.isAddCol) {
        this.addColList();
      }else {
        this.$message.success("还有未填写的列");
      }
    },
    // 新增列
    addColList() {
        let index = this.historyForm.tableHeader.length-1;
       this.historyForm.tableHeader.push({ name:'',nameEn:'selfName'+index})
      let list = this.historyForm.tableData;
      for (let i = 0; i < list.length; i++) {
        this.$set( list[i]['selfName'+index], '');
      }
    },
    // 修改表头名fun
    setColName(index, val) {
      let head = this.historyForm.tableHeader;
      this.$set(head[index],'name',val)
      this.$forceUpdate();
      console.log(head);
    },
    // 输入内容数据的fun
    setInputVal(e) {
      for (let i in this.historyForm.tableHeader) {
        if (this.historyForm.tableHeader[i].name === "") {
          this.isAddCol = false;
        }else {
          this.isAddCol = true;
        }
      }
      if (!this.isAddCol) {
        this.$message.success("请先填写完成所有表头内容,且确保无误!");
      }
    },
    // 右键单击选中行-确认是否删除行
    rightClickRowShowFun(row, column, event) {
      this.currentClickRow = row.index;
       this.$confirm('此操作将永久删除当前行, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
         this.deleteRow(this.currentClickRow);
      }).catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });          
      });
    },
    // 右键单击选中行-确认是否删除列
    rightClickColShowFun(column, event) {
      this.currentClickCol = column.index;
      if(this.currentClickCol <= 3){
          this.$message({
            type: 'info',
            message: '当前列不支持删除!'
          }); 
      }else{
        this.$confirm('此操作将永久删除当前列, 是否继续?', '提示', {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
        }).then(() => {
            this.deleteCol(this.currentClickCol);
        }).catch(() => {
            this.$message({
                type: 'info',
                message: '已取消删除'
            });          
        });
      }
    
    },
    // 给数据的row、column赋index,便于进行删除行、删除列
    tableClassName({row, column, rowIndex, columnIndex}) {
      row.index = rowIndex;
      column.index  = columnIndex-1;
     
    },
    // 删除当前列
    deleteCol (index) {
        let nameCur = this.historyForm.tableHeader[index].nameEn;
        for (const key in this.historyForm.tableData) {
          // 删除nameEn属性
          let data = this.historyForm.tableData[key]
          console.log(data[nameCur])
          delete data[nameCur];
        }
       console.log(this.historyForm.tableData);
        this.historyForm.tableHeader.splice(index, 1);
    },
  },
}
</script>
<style lang="scss" scoped>
.haplotype-detail{
   .add-column, .add-line{
        background:#f2f2f2;
        width:30px;
        cursor:pointer;
        font-size:30px;
        color:#00c561;
        justify-content: center;
        flex-direction: column;
        align-items: center;
        display: flex;
   }
   .add-line{
    height:30px;
    width:97%;
   }
   .headerBox{
    padding:0px;
   }
}
</style>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

el-table动态添加行,列。自定义输入表头,input hover 显示文字 的相关文章

  • 如何在react-bootstrap中禁用表单提交的

    在下面的代码片段中 我有许多文本类型的输入表单 如果用户点击 我似乎会得到相同的合成事件 就像他们按下提交按钮一样 我想忽略作为表单提交 只允许一个人按下 提交 按钮 我删除了一些表单组以减少示例 在所有情况下 按钮或 ENTER 键 e
  • 悬停此元素时隐藏元素后的伪元素

    我的菜单垂直放置在页面左侧和菜单之间 li 我有一个 after那是一个分隔符 我想要的是当我悬停元素本身 如果它是第一个元素 时隐藏 after 元素 或者当它是中间元素时隐藏上面和底部的元素 如果它是最后一个子元素 则隐藏 after前
  • 如何更改 Google Maps v3 API for Directions 中的开始和结束标记图像

    我使用 DirectionsRender 绘制了一条路线 但我不知道如何用我自己的标记替换通用的 Google 标记 我知道并在正常的谷歌地图情况下使用它 但发现很难用开始和结束的方向标记来做到这一点 如果这是一个愚蠢的问题 感谢您的任何建
  • 图像无法在带有 DOM 的 IE 中加载:控制台中的 7009 错误(无法解码)

    当在 IE 中的单个页面上加载许多图像时 在 IE11 中重现 其中一些图像开始加载失败 并在控制台中出现类似以下警告的内容 DOM7009 无法解码 URL 处的图像 某些唯一的 url 当我查看网络流量时 似乎确实从服务器收到了每个图像
  • 带有淘汰赛js的隐形recaptcha

    我正在完成隐形验证码 但我在实现它时遇到问题 谷歌开发人员页面中的代码显示它应该是这样的
  • 隐藏 Div 的父级

    我只是想隐藏父divcomments section div class content content green div div div 我试过这个 document getElementById comments section pa
  • 如何将函数附加到弹出窗口关闭事件(Twitter Bootstrap)

    我做了一些搜索 但我只能认为我可以将事件附加到导致其关闭的按钮 https stackoverflow com questions 13205103 attach event handler to button in twitter boo
  • HTML5 MediaSource 适用于某些 mp4 文件,但不适用于其他文件(相同的编解码器)

    我正在玩 MediaSource API 代码直接取自 Mozilla 的示例页面 https developer mozilla org en US docs Web API MediaSource endOfStream https d
  • Jquery 数据表列总和

    我只是参考一下这个链接 https datatables net examples advanced init footer callback html了解如何获取 jquery 数据表中的列总计 但我已经完成了一半的项目 我在html页面
  • php - 解析html页面

    div divbox div p para1 p p para2 p p para3 p table class table tr td td tr table p para4 p p para5 p 有人可以告诉我如何解析这个 html
  • 使用 CSS 或 Javascript 填充动画

    我只是想知道是否可以使用 CSS 或 javascript 创建填充动画 基本上我想创建一个填充动画 如下图所示 http i40 tinypic com eit6ia png http i40 tinypic com eit6ia png
  • DataTables row.add 到特定索引

    我正在替换这样的行项目 var targetRow entity row dataTable targetRow closest table dataTable DataTable dataTable row targetRow remov
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • Firebase 函数 onWrite 未被调用

    我正在尝试使用 Firebase 函数实现一个触发器 该触发器会复制数据库中的一些数据 我想观看所有添加的内容votes user vote 结构为 我尝试的代码是 const functions require firebase func
  • 日期出现奇怪的错误,“未捕获非法访问”

    所以我试图找到最新的DateJavascript 可以处理 我把它减少到 9 月 275760 并增加了我开始捕获未捕获的天数illegal access例外new Date 09 24 275760 to new Date 10 13 2
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 在 HTML 下拉列表中有一个滚动条

    我正在寻找一种在 HTML 的下拉列表中添加滚动条的方法 这样如果下拉列表包含的内容超过例如 5 项 将出现滚动条以查看其余项 这是因为我将被迫列出一些大清单 过去几个小时我一直在谷歌上搜索它 但没有运气 它需要适用于 IE8 FF 和 C
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • 表格行未扩展到全宽

    我有一个表格 当我将表格的宽度设置为 100 并将表格行的宽度设置为 100 时 没有任何反应或宽度发生变化 Table Normal position relative display block margin 10px auto pad
  • 在 CKEditor 中设置字体大小和字体系列

    我正在使用 ckeditor 我想问一下这个插件如何设置font family和font size 我尝试过使用 CKEDITOR config font defaultLabel Arial CKEDITOR config fontSiz

随机推荐

  • 软件测试外包公司怎么样?为什么没人去?看我终极解密外包!

    目录 导读 一 前言 什么是软件测试外包 二 软件测试外包的好处与坏处 三 进软件测试外包公司前的思考 四 软件测试外包流行的原因挖掘 五 总结 一 前言 什么是软件测试外包 随着最近10年创业风气的发起 已经涌起创业项目外包公司的兴起 已
  • 算法笔记5.6--N的阶乘

    题目描述 输入一个正整数N 输出N的阶乘 输入 正整数N 0 lt N lt 1000 输出 输入可能包括多组数据 对于每一组输入数据 输出N的阶乘 样例输入 0 4 7 样例输出 1 24 5040 代码 struct bign int
  • 史上最全的 Spring Boot 学习教程

    本文目录 一 Spring Boot入门 二 Spring Boot配置 三 Spring Boot与日志 四 Spring Boot与Web开发 五 Spring Boot与Docker 六 Spring Boot与数据访问 七 Spri
  • 历时130天784分通过了HCIE笔试

    这是自己送给自己2023年最好的礼物 从学习到备考笔试经历了130天 对我来说每天都是背负着一个沉重的包袱前行 活的很累很累 期间不被人理解 学到崩溃 并且放弃了n次又爬起来 不得不说这些我都熬过来了 其实感觉一张成绩单就能检验一个人的能力
  • kinect fusion+opencv程序

    define CRT SECURE NO WARNINGS include pch h This file is part of OpenCV project It is subject to the license terms in th
  • C++:实现socket通信(TCP/IP)实例

    首先声明 博主之前从来没有写过通信方面的东西 这次之所以写这个是因为项目需要 因此本文主要介绍一个使用C 语言及Socket来实现TCP IP通信的实例 希望可以帮助入门者 本教程 属于基础教程 针对入门者 如需更深入的功能 自行扩展 IP
  • 【数据结构】图的创建与遍历

    图 Graph 是由顶点的有穷非空集合和顶点之间边的集合组成 通常表示为 G V E 其中 G表示一个图 V是图G中顶点的集合 E是图G中边的集合 线性表 线性关系 由直接前驱和直接后继组成 树 层次关系 由父结点和孩子结点组成 每个结点最
  • 访问XP共享出现的问题解决办法

    好多xp系统启用了guest也无法网络访问 故障解决如下 启用了guest为什么仍然不能访问 1 默认情况下 xp 禁用guest帐户 2 默认情况下 xp的本地安全策略禁止guest用户从网络访问 3 默认情况下 xp的本地安全策略 用户
  • redisson分布式锁

    RLock官网解释 基于Redis的Java分布式可重入锁对象 实现了锁接口 如果获得锁的Redisson实例崩溃 那么这种锁可能永远挂起在获得状态 为了避免这种情况 Redisson维护了锁看门狗 它在锁持有者Redisson实例活着的时
  • CKEditor去掉默认的

    的处理

    CKEditor在使用的时候 编辑框中总是默认带有P元素 如何去掉呢 请看下面 1 在ckeditor里的config js中添加 config enterMode 1 回车的时候增加的是p config enterMode 2 回车的时候
  • 毕业设计-基于深度学习的作物长势监测和产量估测研究

    目录 前言 课题背景和意义 实现技术思路 一 区域尺度的作物长势监测和产量估测研究进展 二 田块尺度的作物长势监测和产量估测研究进展 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准
  • CMAKE——message()函数

    message 为用户显示一条消息 message STATUS WARNING AUTHOR WARNING FATAL ERROR SEND ERROR message to display 可以用下述可选的关键字指定消息的类型 无 重
  • keil编译后报错Error:L6218E的解决方法汇总

    一 检查有没有添加头文件或者源文件 1 头文件 添加 举例子 Error L6218E Undefined symbol MX SPI1 Init referred from w25q64 o 中MX SPI1 Init函数所在头文件 或者
  • react - 条件渲染,列表渲染,表单绑定,状态提升

    九 条件渲染 在 React 中 你可以创建不同的组件来封装各种你需要的行为 然后还可以根据应用的状态变化只渲染其中的一部分 React 中的条件渲染和 JavaScript 中的一致 使用 JavaScript 操作符 if 或条件运算符
  • Leetcode 1523 在区间范围内统计奇数数目

    Leetcode 1523 在区间范围内统计奇数数目 题目描述 给你两个非负整数 low 和 high 请你返回 low 和 high 之间 包括二者 奇数的数目 示例 1 输入 low 3 high 7 输出 3 解释 3 到 7 之间奇
  • android刷机恢复出厂设置吗,安卓手机恢复出厂设置和双清有什么区别?

    1 恢复出厂设置是 把手机恢复到你刚买到手时候的状态 手机里的软件设置等都恢复到出厂时候的 后来设置都取消 但是内存卡里的东西还在 2 双清指的是 清理手机内的用户数据和储存里的东西 可以有效的提高手机的运行速度 手机双清是进入手机的rec
  • Mac删除虚拟声卡

    打开Mac的文件管理器 到目录 Library Audio Plug Ins HAL 下直接删除想要的声卡文件夹即可 一般文件夹的结尾是 driver结尾的 重启系统
  • 新书上市

    2020年12月30日晚上 曹则贤老师在中科院跨年科学晚会上带来了 广义相对论 主题演讲 并且在开头部分就甩出了一个相对论书单 都是在这个领域有过基础贡献的大师著作 其中的一本 广义相对论 格外清奇 它只有64页 曹老师对这本书也是赞不绝口
  • MarkDown创建表格

    凑微分方法 1 csc 2 xdx d cotx 2 secxtanxdx d secx 3 cscxcotxdx d cscx 4 dfrac 1 1 x 2 dx d arctanx d arccotx 5 dfrac 1 sqrt 1
  • el-table动态添加行,列。自定义输入表头,input hover 显示文字

    功能点 1 动态添加行 2 动态添加列 3 右键表头删除列 4 右键表体删除行 5 表格hover提示当前单元格文字 自动换行 6 表头文字自定义 7 表头 添加按钮固定 表体自适应滚动 效果图 代码 复制即可运行