vue element-ui自定义表头,动态添加表头,新增行、新增列、删除行、删除列

article/2025/8/6 13:13:31

vue element-ui表格怎样自定义表头,动态添加表头,新增行、新增列、删除行、删除列

  • 需求描述
    • 1.自定义表头,表头里插入输入框
    • 2.默认初始化几行几列占位
    • 3.新增行
    • 4.新增列
    • 5.右键点击行,进行删除行
    • 6.右键点击表头,进行删除列
    • 7.效果展示
    • 8.所有代码总结

需求描述

根据项目需求,需要用户填写几行几列,表头自定义动态添加,用户可以手动新增行、新增列、删除行、删除列,怎么实现一起来看看吧~

1.自定义表头,表头里插入输入框

<el-form ref="historyForm" :model="historyForm" size="small"><div class="table-box" @contextmenu.prevent.capture><el-table:data="historyForm.tableData":loading="loading"style="width: 100%"class="list-table default-scrollbar"size="mini"@header-contextmenu="rightClickColShowFun"@row-contextmenu="rightClickRowShowFun":cell-class-name="tableClassName"border><el-table-column label="序号" align="center" width="50"><template slot-scope="scope">{{scope.$index+1}}</template></el-table-column><el-table-column label="等位基因" align="center" prop="name" class-name="cellDefault"><template slot-scope="scope"><el-input v-model="scope.row.name" class="name-input"></el-input></template></el-table-column><el-table-column :label="'ABO-'+`${colList.length}`+'位点'" class-name="specital-title"><el-table-column align="center" class-name="cellDefault" v-for="(item,index) in colList" :key="index" min-width="40"><template #header><el-input v-model="colList[index]" size="mini" @change="setColName(index,colList[index])"/></template><template slot-scope="scope"><el-input type="number" v-model.number="scope.row[item].value" @input="setInputVal" :class="scope.row[item].checked ? 'red' : ''"></el-input></template></el-table-column></el-table-column></el-table><div class="add-column" @click="addColSetting">+</div></div><div class="add-line" @click="addParamsSetting">+</div>
</el-form>
data() {return {// 遮罩层loading: true,// 表单参数-表格内容数据historyForm: {tableData: []},// 表头列表数组colList: [],isAddCol: true,colNum: 0,rowNum: 0,currentId: null,mouldName: "A101templete",dialogRowVisible: false,// 新增行dialogColVisible: false,// 新增列currentClickRow: null,currentClickCol: null,resultList: [],};
},

特别注意: 添加 #header 才能自定义插入表头,否则会出现input框不能进行输入的Bug。

2.默认初始化几行几列占位

例如当前为3行4列占位,效果如下图展示。
在这里插入图片描述

methods: {// 根据默认几行几列初始化表格init() {for (let i = 0; i < this.colNum; i++) {this.colList.push("");}for (let j = 0; j < this.rowNum; j++) {if (j === 0) {this.historyForm.tableData.push({name: this.mouldName,"": {value: null,checked: 0}});}else {this.historyForm.tableData.push({name: null,"": {value: null,checked: 0}});}}},
}

3.新增行

// 新增行
methods: {// 在数组最后添加一行addParamsSetting () {this.addList()},addList () {let item = {name: null,};for (let i in this.colList) {item[this.colList[i]] = {value: null,checked: 0}}this.historyForm.tableData.push(item);},
}

4.新增列

methods: {// 在数据最后新增一列addColSetting() {for (let i in this.colList) {if (this.colList[i] === "") {this.isAddCol = false;}else {this.isAddCol = true;}}if (this.isAddCol) {this.addColList();}else {this.$message.success("还有未填写的列");}},// 新增列addColList() {let list = this.historyForm.tableData;for (let i = 0; i < list.length; i++) {list[i][""] = {value: null,checked: 0};}this.colList.push("");},
}

注意事项: 因为表头是自定义输入框动态添加的,所以需要限制用户先把表头填写完成,再进行填写单元格的内容,新添加列也同理,否则会出现数据重复的Bug。

5.右键点击行,进行删除行

想要删除行,首先要拿到rowIndex,我们可以利用:cell-class-name=“tableClassName”,拿到rowIndex,赋值给row,@row-contextmenu=“rightClickRowShowFun”,即可拿到行的索引,进行删除行操作。

methods: {// 给数据的row、column赋index,便于进行删除行、删除列tableClassName({row, column, rowIndex, columnIndex}) {row.index = rowIndex;column.index  = columnIndex - 2;if(rowIndex === 0){return 'blue'}},// 右键单击选中行-确认是否删除行rightClickRowShowFun(row) {this.currentClickRow = row.index;this.dialogRowVisible = true;},// 确认删除行submitFunRow() {this.dialogRowVisible = false;this.deleteRow(this.currentClickRow);},// 删除当前行deleteRow (index) {this.historyForm.tableData.splice(index, 1)},
}

6.右键点击表头,进行删除列

想要删除列,首先要拿到columnIndex,我们可以利用:cell-class-name=“tableClassName”,拿到columnIndex,赋值给column,@header-contextmenu=“rightClickColShowFun”,即可拿到列的索引,进行删除列操作。

methods: {// 给数据的row、column赋index,便于进行删除行、删除列tableClassName({row, column, rowIndex, columnIndex}) {row.index = rowIndex;column.index  = columnIndex - 2;if(rowIndex === 0){return 'blue'}},// 右键单击选中行-确认是否删除列rightClickColShowFun(column, event) {this.currentClickCol = column.index;this.dialogColVisible = true;},// 确认删除列submitFunCol() {this.dialogColVisible = false;this.deleteCol(this.currentClickCol);},// 删除当前列deleteCol (index) {this.colList.splice(index, 1)},
}

7.效果展示

在这里插入图片描述
单元格和表头内都插入的是输入框,写css样式可以进行修改输入框样式,我这里给单元格内的输入框限制了number类型(v-model.number),会出现上下增加数值的按钮,我给隐藏掉了,代码如下:

.cellDefault{padding: 0!important;.cell{padding: 0!important;input{border: none;border-radius: 0;text-align: center;background: #EEF8FF;padding: 0;}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button {-webkit-appearance: none !important;margin: 0;}}}

8.所有代码总结

<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><el-table:data="historyForm.tableData":loading="loading"style="width: 100%"class="list-table default-scrollbar"size="mini"@header-contextmenu="rightClickColShowFun"@row-contextmenu="rightClickRowShowFun":cell-class-name="tableClassName"border><el-table-column label="序号" align="center" width="50"><template slot-scope="scope">{{scope.$index+1}}</template></el-table-column><el-table-column label="等位基因" align="center" prop="name" class-name="cellDefault"><template slot-scope="scope"><el-input v-model="scope.row.name" class="name-input"></el-input></template></el-table-column><el-table-column :label="'ABO-'+`${colList.length}`+'位点'" class-name="specital-title"><el-table-column align="center" class-name="cellDefault" v-for="(item,index) in colList" :key="index" min-width="40"><template #header><el-input v-model="colList[index]" size="mini" @change="setColName(index,colList[index])"/></template><template slot-scope="scope"><el-input type="number" v-model.number="scope.row[item].value" @input="setInputVal" :class="scope.row[item].checked ? 'red' : ''"></el-input></template></el-table-column></el-table-column></el-table><div class="add-column" @click="addColSetting">+</div></div><div class="add-line" @click="addParamsSetting">+</div><div class="start-btn-box"><el-button type="primary" @click="startComparisonFun" class="start-btn">开始对比</el-button></div></el-form></div><el-dialogtitle="温馨提示":visible.sync="dialogRowVisible"width="250px"><span>确定删除此行数据嘛?</span><div slot="footer" class="dialog-footer"><el-button @click="dialogRowVisible = false">取 消</el-button><el-button type="primary" @click="submitFunRow">确 定</el-button></div></el-dialog><el-dialogtitle="温馨提示":visible.sync="dialogColVisible"width="250px"><span>确定删除此列数据嘛?</span><div slot="footer" class="dialog-footer"><el-button @click="dialogColVisible = false">取 消</el-button><el-button type="primary" @click="submitFunCol">确 定</el-button></div></el-dialog></div>
</template>
<script>
export default {name: "haplotypeDetail",data() {return {// 遮罩层loading: true,// 表单参数-表格内容数据historyForm: {tableData: []},// 表头列表数组colList: [],isAddCol: true,colNum: 0,rowNum: 0,currentId: null,mouldName: "A101templete",dialogRowVisible: false,// 新增行dialogColVisible: false,// 新增列currentClickRow: null,currentClickCol: null,resultList: [],};},methods: {// 根据默认几行几列初始化表格init() {for (let i = 0; i < this.colNum; i++) {this.colList.push("");}for (let j = 0; j < this.rowNum; j++) {if (j === 0) {this.historyForm.tableData.push({name: this.mouldName,"": {value: null,checked: 0}});}else {this.historyForm.tableData.push({name: null,"": {value: null,checked: 0}});}}},// 在数组最后添加一行addParamsSetting () {this.addList()},// 新增行addList () {let item = {name: null,};for (let i in this.colList) {item[this.colList[i]] = {value: null,checked: 0}}this.historyForm.tableData.push(item);},// 删除当前行deleteRow (index) {this.historyForm.tableData.splice(index, 1)},// 在数据最后新增一列addColSetting() {for (let i in this.colList) {if (this.colList[i] === "") {this.isAddCol = false;}else {this.isAddCol = true;}}if (this.isAddCol) {this.addColList();}else {this.$message.success("还有未填写的列");}},// 新增列addColList() {let list = this.historyForm.tableData;for (let i = 0; i < list.length; i++) {list[i][""] = {value: null,checked: 0};}this.colList.push("");},// 修改表头名funsetColName(index, val) {let list = this.historyForm.tableData;for (let i = 0; i < list.length; i++) {this.$set(list[i],val,{value: null,checked: 0})}this.$forceUpdate();},// 输入内容数据的funsetInputVal() {for (let i in this.colList) {if (this.colList[i] === "") {this.isAddCol = false;}else {this.isAddCol = true;}}if (!this.isAddCol) {this.$message.success("请先填写完成所有表头内容,且确保无误!");let list = this.historyForm.tableData;for (let j = 0; j < list.length; j++) {if (list[j][""]) {list[j][""] = {value: null,checked: 0};}}}},// 右键单击选中行-确认是否删除行rightClickRowShowFun(row, column, event) {this.currentClickRow = row.index;this.dialogRowVisible = true;},// 右键单击选中行-确认是否删除列rightClickColShowFun(column, event) {this.currentClickCol = column.index;this.dialogColVisible = true;},// 确认删除行submitFunRow() {this.dialogRowVisible = false;this.deleteRow(this.currentClickRow);},// 给数据的row、column赋index,便于进行删除行、删除列tableClassName({row, column, rowIndex, columnIndex}) {row.index = rowIndex;column.index  = columnIndex - 2;if(rowIndex === 0){return 'blue'}},// 确认删除列submitFunCol() {this.dialogColVisible = false;this.deleteCol(this.currentClickCol);},// 删除当前列deleteCol (index) {this.colList.splice(index, 1)},},
}
</script>
<style lang="scss">
.haplotype-detail{.list-table{background: #EEF8FF;&.el-table thead.is-group th.el-table__cell{background: #EEF8FF;}&.el-table td.el-table__cell{background: #EEF8FF;color: #0083D7;}.name-input{input{color: #0083D7;}}.specital-title{color: #0083D7;font-size: 16px;font-family: Source Han Sans CN;font-weight: bold;}}.el-table--enable-row-hover .el-table__body tr:hover > td.el-table__cell{background: #A0D8FF;.cell input{background: #A0D8FF;}}.cellDefault{padding: 0!important;.cell{padding: 0!important;input{border: none;border-radius: 0;text-align: center;background: #EEF8FF;padding: 0;}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button {-webkit-appearance: none !important;margin: 0;}}}th.cellDefault{input{background: #F5F7FA;}}.red{background: #E8CCCB;input{background: #E8CCCB!important;color: #DD262F;}}.blue{background: #A0D8FF!important;input{background: #A0D8FF!important;}}
}

http://chatgpt.dhexx.cn/article/bYWkAm90.shtml

相关文章

sql delete删除列_现有表操作中SQL DELETE列概述

sql delete删除列 In this article, we will explore the process of SQL Delete column from an existing table. We will also understand the impact of removing a column with defined constraints and objects on it. 在本文中,我们将探讨从现有表中删除SQL列的过程。 …

Notepad++快速删除列或者列位置增加相同内容

一、快速删除列(一列或者多列) 方法&#xff1a;鼠标选择范围的起始位置&#xff0c;按住AltShift&#xff0c;然后鼠标选择范围的结束位置 使用‘BackSpace’删除即可 二、快速增加列内容 方法&#xff1a;鼠标放在第一行某一列&#xff0c;按住AltShift&#xff0c;然后鼠…

poi移动列和删除列

Java poi 移动列 删除列 移动列删除列最后 移动列 从poi4.0.0开始&#xff0c;在sheet里面提供了一个移动列的api shiftColumns(int startColumn, int endColumn, final int n)&#xff0c; 移动开始列、结束列和移动列数。 需要注意的是&#xff0c; 移动到的列需要没有格式…

python删除csv某一列_python csv 删除列

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我的input.csv看起来是这样的: day,month,year,lat,long01,04,2001,45.00,120.0002,04,2003,44.00,118.00 我试图删除“year”栏及其所有条目。 总共有40多个条…

Sqlite删除列方法

sqlite中是不支持删除列操作的&#xff0c;所以网上alter table table_name drop column col_name这个语句在sqlite中是无效的&#xff0c;而替代的方法可以如下&#xff1a; 1.根据原表创建一张新表 2.删除原表 3.将新表重名为旧表的名称 示例例子如下 1.创建一张旧表Stu…

oracle中如何删除列,oracle如何删除列?

oracle删除列的方法&#xff1a;1、删除一列&#xff0c;代码为【ALTER TABLEtable_name DROP COLUMNcolumn_name;】&#xff1b;2、删除多列&#xff0c;代码为【ALTER TABLE table_name DROP(column1&#xff0c;】。 oracle删除列的方法&#xff1a; 1、删除一列 ALTER TABL…

pandas—删除某行或某列数据

首先&#xff0c;创建一个DataFrame格式数据作为举例数据。 # 创建一个DataFrame格式数据 data {a: [a0, a1, a2],b: [b0, b1, b2],c: [i for i in range(3)],d: 4} df pd.DataFrame(data) print(举例数据情况&#xff1a;\n, df)注&#xff1a;DataFrame是最常用的pandas对象…

【QT设计师】某视频视频源

#coding:utf8程序制作&#xff1a;冷鱼闲风 制作日期&#xff1a;2021年12月06日 申明&#xff1a;本程序仅供学习&#xff0c;请勿用作商业用途和违法行为。 ps&#xff1a;程序还有很多值得改进的地方&#xff0c;欢迎大神帮我指出可以优化的地方吧&#xff0c;谢谢大家。 #导…

html页面如何访问rtsp视频源

基本知识: 1. 目前web不能直接访问rtsp视频源(不考虑安装插件的情况) 2. html页面播放视频的四种方式 1.)视频文件(如mpeg,webm,部署最简单,实时性较差) 2.)webrtc协议, 实时性能最好 3.) websokect 协议, 需要自己封装,也有一些开源和商业库 4.)rtmp协议(需…

H5Stream配置视频源

H5Stream配置视频源 配置视频源主要有两种&#xff1a;配置设备、配置sdk&#xff1b;主要说明两种配置配置方式区别。 方式一&#xff1a;设备方式 此方式可能不支持云台控制&#xff0c;摄像头比较少情况可采用此配置。 方式二&#xff1a;设备SDK 可能很多同学不清楚此模…

Android电视盒子最强看电视app-tvbox配置(视频源)教程

今天给大家分享一下安卓tv上最强的看视频神器-tvbox的配置方法 tvbox是一款影视观看类的软件&#xff0c;各种影视资源都是为你免费提供的&#xff0c;还有海量热门影视为你提供电视直播&#xff0c;让你可以实时在线进行观看以及体验一样&#xff0c;超多影视剧内容你感兴趣的…

使用H5Stream实现rtsp视频流播放,在Vue项目中 (无插件、可多视频源播放、亲测可用)

本文主要介绍用H5Stream 在Web页面播放摄像头的RTSP视频流&#xff0c;从0到1的过程。包括WebSocket代理、h5ss.bat文件 运行一会就自己卡死了、H5ss服务死掉自动定时重启的脚本 等可以遇到的问题。 第一步&#xff1a; 点击这个链接下载 h5s-r12.13.0805.21-win64-release.z…

网络视频源地址抓包分析(3)之获取腾讯视频源码

有朋友问我如何获取网络腾讯的网络视频&#xff0c;今天翻了一下3年前写的代码&#xff0c;发现还能用&#xff0c;但没有太多注释&#xff0c;凑合看吧。获取的网络视频地址无任何广告&#xff0c;为CDN最后返回的结果&#xff0c;可直接播放或下载。有些视频过大&#xff0c;…

苹果海洋视频源直播源文件

苹果海洋视频源文件&#xff1a;【0708视频源.rar】 链接下载&#xff1a; https://wwr.lanzoui.com/i3OlOr4cc4j 二维码下载&#xff1a; 苹果海洋直播源文件&#xff1a;【0708直播源.rar】 链接下载&#xff1a; https://wwr.lanzoui.com/iHm9dr89vvg 二维码下载&…

推荐一款跨平台视频播放器:ZY-Player

欢迎关注我的公众号&#xff1a;「阿拉平平」 有需要的小伙伴可以在微信后台回复 zyplayer 获取安装包 之前和大家安利过一款在线视频播放器&#xff1a;h-player&#xff0c;通过导入视频源就可以聚合播放视频&#xff0c;省去搜索资源的时间。不过可惜的是&#xff0c;作者很…

2021-08-29json

异步加载&#xff1a; 如何实现&#xff1f;不会阻断HTML CSS的下载&#xff0c; defer&#xff1a;只有IE9以下能用 和htmlcss并行下载 也可以这样在里面写&#xff1a;代码可以写到内部 执行&#xff1a; 正常js标签:下载完毕执行&#xff0c;执行完后加载html&#xff0c;…

创建 RTSP RTMP 视频源(Windows/Linux)

1. 前言 由于项目需要实现 视频识别图像分类&#xff0c;网上能用的视频流又很少&#xff0c;所以需要自己搭建视频源进行本地测试。 本文记录在 Windows 以及 Linux 系统分别创建 RTSP、RTMP 视频源 进行测试。 2. 准备 2.1 视频 我们要准备好一份 mp4 格式的视频&#xff…

腾讯爱奇艺优酷

看不懂的 可以进入下面的教程链接 目录 看不懂的 可以进入下面的教程链接what it can do &#xff1f;how to do &#xff1f;&#xff08;点链接进入教程&#xff09;总结why&#xff1f; what it can do &#xff1f; 替你在另外一个网站上找到内容&#xff08;for free&…

爱奇艺、优酷、腾讯视频竞品分析报告2016(二)

接上一篇《爱奇艺、优酷、腾讯视频竞品分析报告2016&#xff08;一&#xff09;》 http://milkyqueen520.blog.51cto.com/11233158/1760192 2.4 产品设计与交互 2.4.1 视觉风格 APP设计风格从视觉效果上至少给用户传达了两个信息&#xff1a;一是APP的整体基调。二是APP的目标…