实现表格表头自定义编辑、一键导入、增加列

 1.前言

本文基于vue2及elementUI的表格组件

 


2.效果及功能展示 

 


 3.需求背景

有时候客户急需看到需求实现的页面,而此时后端接口没有,产品原型没有,只能前端出马,画一个静态页面,来展示客户想要的东西,如果是通过F12来改很慢,于是就有了这篇文章,使用它可以轻松的对表格的任何地方进行修改,且可以增加减少行或者列,它完全是由数据控制的,而在此基础上,还支持一键导入的功能,可以不用一个一个的编辑,直接一步到位。


4.技术实现

4.1 表格编辑

要说明的是,我使用的elementUI的表格组件,针对表格他们提供了一些事件,比如 点击表头事件:

说白了,其实就是将框架提供给我们的事件回调函数中有用的部分,对表头数据进行修改即可

4.2 表格增加列

在事件回调中,对数据进行push操作

4.3 一键导入

思路是 使用input标签的file文件上传功能(原生的标签过于丑陋,我给隐藏了,使用好看的按钮触发input的click事件即可) ,然后将导入的文件读取,并保存到变量中,转为数组。

我是在文件中放了两个数组,上面是表头,下面是表格数据。

我准备的数据源及格式如下:

 


5.核心代码展示


<template><div><div class="main-title" @click="$refs.fileInput.click()" >xxx库</div><input ref="fileInput" style="display:none" type="file" id="data2"                         @change="upload()"><div class="tollboxlist context_box_bg"><div class="search-box"><el-table :data="tableData" style="width: 98%;align: center" @cell-click="tsetClick" @header-click="headerTest"><el-table-column :label="item.propName" :property="item.prop" v-for="item in tableColumnList" :key="item.prop" align="center"><template slot-scope="scope"><span @click="getIndex(scope.$index)">{{scope.row[scope.column.property]}}</span></template></el-table-column><el-table-column label="." width="20" prop="addTableHeaderName" align="center"/></el-table><el-dialog :visible.sync="dialogForHeader" title="修改项目流程名称" width="800"><el-form ref="form" :model="tableHeader" label-width="80px"><el-form-item label="表头名称"><el-input v-model="tableHeader.tableHeaderName" placeholder="请输入表头名称" /></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button type="primary" @click="submitForm">确 定</el-button><el-button @click="cancel">取 消</el-button></div></el-dialog><el-dialog :visible.sync="dialogForTable" title="修改项目流程内容" width="800"><el-form ref="form" :model="tableCell" label-width="120px"><el-form-item label="流程内容名称"><el-input v-model="tableCell.tableCellData" placeholder="流程内容名称" /></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button type="primary" @click="submitForm1">确 定</el-button><el-button @click="cancel1">取 消</el-button></div></el-dialog><el-pagination:page-size="page_size" backgroundlayout="total,  prev, pager, next, sizes,jumper":total="total":current-page="page"@size-change="handleSizeChange"@current-change="handleCurrentChange"></el-pagination> </div></div><el-dialog class="zidiandia" title="新建字典" :visible.sync="createDictionaries" v-if="createDictionaries"  :before-close="cancelform" width='1184px' :close-on-click-modal="false" :show-close="false"><div class="dialog_b_btn">  <el-button size="small" @click="handleCreateSave">保存</el-button><el-button size="small" @click="handleSaveCancel">取消</el-button></div><Edit:exhibitionList="exhibitionList":serviceType="serviceType":dictionariesType="dictionariesType":pageType = "pageType"ref="createEditRef"></Edit></el-dialog><el-dialog title="详情"  :visible.sync="editDictionaries"  :before-close="cancelform" width='1184px' :close-on-click-modal="false" :show-close="false"><div class="dialog_b_btn">  <el-button size="small" @click="handleClickEdit" v-if="isUpdate">编辑</el-button><el-button size="small" v-else >编辑中</el-button><el-button size="small" @click="handleEditSave" v-if="!isUpdate">保存</el-button><el-button size="small" @click="handleEditCancel">取消</el-button></div><Editv-if="editShow":show="isUpdate":exhibitionList="exhibitionList":serviceType="serviceType":dictionariesType="dictionariesType":editData="editData":pageType = "pageType"ref="cancelEditRef"></Edit></el-dialog></div>
<!-- 6666666666666 --></template><script>export default {data() {return {// 这里为了简便我就没有调用后台接口获取数据,直接写的假数据  你要用的话可以调用后台接口 获取tableColumnList,注意数据格式tableColumnList:[{prop: '0', propName: '编号8888'},{prop: '2', propName: '名字'},{prop: '3', propName: '保质期'},{prop: '4', propName: '特点1'},],tableData: [{0: '2016-05-01',2: '王小虎1',3: '上海市普陀区金沙江路 1518 弄',4: '2016-05-02',}, {0: '2016-05-02',2: '王小虎2',3: '上海市普陀区金沙江路 1518 弄',4: '2016-05-02',}, {0: '2016-05-03',2: '王小虎3',3: '上海市普陀区金沙江路 1518 弄',4: '2016-05-02',}, {0: '2016-05-04',2: '王小虎4',3: '上海市普陀区金沙江路 1518 弄',4: '2016-05-02',}, {0: '2016-05-05',2: '王小虎5',3: '上海市普陀区金沙江路 1518 弄',4: '2016-05-06',}, {0: '2016-05-07',2: '王小虎6',3: '上海市普陀区金沙江路 1518 弄',4: '2016-05-02',},{0: '2016-05-07',2: '王小虎6',3: '上海市普陀区金沙江路 1518 弄',4: '2016-05-02',},{0: '2016-05-07',2: '王小虎6',3: '上海市普陀区金沙江路 1518 弄',4: '2016-05-02',},{0: '2016-05-07',2: '王小虎6',3: '上海市普陀区金沙江路 1518 弄',4: '2016-05-02',},{0: '2016-05-07',2: '王小虎6',3: '上海市普陀区金沙江路 1518 弄',4: '2016-05-02',}],}},methods: {upload(e){let that = this;console.log("点击了上传按钮");let da = window.event || e  // change事件获取到的数据var file = da.target.files[0]console.log(file, 'file===');if (true) {var reader = new FileReader()reader.readAsText(file, "utf-8")//gbk编码 还有其他方式比如gpkreader.onload = function (da) {console.log(da.target.result, 'da',Object.prototype.toString.call(da.target.result));//查找字符串中第三个‘[’并截取,分别保存到str1和str2中let str1 = "";let str2 = "";var str = da.target.result;// 计数器,用于记录'['的出现次数var count = 0;// 保存第三个'['字符的索引var startIndex = -1;// 遍历字符串for (var i = 0; i < str.length; i++) {// 如果找到了第2个'['字符if (str[i] === '[') {// 计数器加1count++;// 如果计数器为3,则保存索引并跳出循环if (count === 2) {startIndex = i;break;}}}// 如果找到了第三个'['字符if (startIndex !== -1) {// 使用字符串的截取函数substring将第三个'['之后的内容截取到str1变量str1 = str.substring(0,startIndex);str2 = str.substring(startIndex, str.length );console.log("str1: " + str1);console.log("str2: " + str2);} else {console.log("未找到第三个'['字符");}// console.log(str2, 'str2',Object.prototype.toString.call(str2));that.daoRuJson = eval('(' + str1 + ')')let tabelData = eval('(' + str2 + ')')// that.daoRuJson = eval('(' + da.target.result + ')')that.tableColumnList = that.daoRuJson   that.tableData =  tabelData console.log("表头数据",that.tableColumnList);console.log("表格数据",that.tableData);// console.log(that.daoRuJson, 'that.daoRuJson',Object.prototype.toString.call(that.daoRuJson));}}},handleEdit(index, row) {console.log(index, row);},handleDelete(index, row) {console.log(index, row);},getIndex(index){console.log("index",index);this.tableCellIndex = "";this.tableCellIndex = index;},tsetClick(row, column, cell, event){this.dialogForTable = true;this.columnName = "";this.columnName = column.property;this.tableCell.tableCellData = "";this.tableCell.tableCellData = row[this.columnName];console.log("这里是表格内容单击事件",row);console.log("这里是表格内容单击事件",column)// console.log("这里是表格双击事件",cell)// console.log("这里是表格双击事件",event)},//添加表头,修改表头headerTest(val){if(val.property == "addTableHeaderName"){console.log("这里是表格tou部点击,添加头部事件",val)this.tableColumnList.push({prop: this.num.toString(), propName: '点击编辑项目流程名称'})for (let i = 0; i < this.tableData.length; i++) {//this.tableData[i][parseInt(this.num)] = "请添加内容";this.$set(this.tableData[i],[parseInt(this.num)],"请添加内容");}this.num = this.num+1;}else {console.log("这里是表格tou部点击,修改头部事件",val)this.tableHeader.tableHeaderName = "";this.tableHeader.property = "";this.tableHeader.tableHeaderName = val.label;this.tableHeader.property = val.property;console.log(this.tableHeader.tableHeaderName)this.dialogForHeader = true;}},//表头编辑提交submitForm(){console.log("点击提交按钮");for (let i = 0; i < this.tableColumnList.length; i++) {console.log("this.tableHeader.property",this.tableHeader.property)console.log("this.tableColumnList[i].prop",this.tableColumnList[i].prop)if(this.tableColumnList[i].prop === this.tableHeader.property){this.tableColumnList[i].propName = this.tableHeader.tableHeaderName;}}console.log(this.tableColumnList)this.dialogForHeader = false;},//表格内容编辑提交submitForm1(){//console.log("点击提交按钮");if(this.tableCellIndex === "" || this.tableCellIndex === null){alert("亲,请精准点击表格中的字进行修改!")}else {console.log("this.columnName",this.columnName)console.log("this.tableData[this.tableCellIndex][this.columnName]",this.tableData[this.tableCellIndex][this.columnName])console.log("this.tableData[this.tableCellIndex]",this.tableData[this.tableCellIndex])this.tableData[this.tableCellIndex][this.columnName] = this.tableCell.tableCellData;console.log(this.tableData);this.rush();}this.dialogForTable = false;},//强制刷新数据rush(){this.$set(this.tableData);},//取消表头编辑cancel(){//console.log("点击取消按钮");this.dialogForHeader = false;},//取消表格内容编辑cancel1(){//console.log("点击取消按钮");this.dialogForTable = false;},},}
</script>

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/84803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode | 303.区域和检索-数组不可变

303.区域和检索-数组不可变 欢迎关注公众号“三戒纪元” 题目 给定一个整数数组 nums&#xff0c;处理以下类型的多个查询: 计算索引 left 和 right &#xff08;包含 left 和 right&#xff09;之间的 nums 元素的 和 &#xff0c;其中 left < right 实现 NumArray 类&a…

大数据学习1.3-xShell配置jdk

1.创建java文件 mkdir /usr/local/java 2.切换到java中 cd /user/local/java/ 3.将jdk直接拖到xShell中 4.解压jdk tar -zxvf jdk-8u221-linux-x64.tar.gz 5.配置环境变量-进入环境变量文件 vi /etc/profile 6.添加如下内容 JAVA_HOME/usr/local/java/jdk1.8.0_221 CLASSP…

《Python等级考试(1~6级)历届真题解析》专栏总目录

❤️ 专栏名称&#xff1a;《Python等级考试&#xff08;1~6级&#xff09;历届真题解析》 &#x1f338; 专栏介绍&#xff1a;中国电子学会《全国青少年软件编程等级考试》Python编程&#xff08;1~6级&#xff09;历届真题解析。 &#x1f680; 订阅专栏&#xff1a;订阅后可…

ThinkPHP5,使用unionAll取出两个毫无相关字段表的数据且分页

一&#xff1a;首先来了解一下 union 和 unionAll 1&#xff1a;取结果的并集&#xff0c;是否去重 union&#xff1a;对两个结果集进行并集操作&#xff0c;不包括重复行&#xff0c;相当于distinct&#xff0c;同时进行默认规则的排序&#xff1b; unionAll&#xff1a;对两…

Cesium 问题:二三维切换矩形区域展示不够完整

文章目录 问题分析 问题 设置影响图层覆盖范围时&#xff0c;出现三维和二维切换后展示不够完整的情况&#xff0c; Cesium.Rectangle.fromDegrees(-180, -90, 180, 90)创建的矩形区域&#xff0c;按理说是已经设置了全覆盖&#xff0c;但切换二维后并不全覆盖 例如 三维下 切换…

Redis缓存与从数据取数据性能比较

Redis缓存与从数据取数据性能比较 为什么使用Redis 使用Redis缓存数据有多个原因&#xff0c;包括提高性能、降低数据库负载、减少响应时间和支持临时数据存储等。以下是一些主要原因以及Redis缓存的工作原理和好处&#xff1a; 1. 提高性能&#xff1a; 数据库查询通常是一…

睿趣科技:抖音开一家网店大概什么时候回本

随着移动互联网的迅猛发展&#xff0c;社交媒体平台如抖音成为了商家推广产品和服务的热门渠道之一。许多人都希望能够通过在抖音上宣传自己的产品&#xff0c;甚至考虑开一家网店&#xff0c;但回本的时间是一个关键问题。本文将探讨抖音开一家网店大概什么时候回本的问题。 首…

Ubuntu系统下载及安装教程

史上最全最新Ubuntu安装教程&#xff08;图文&#xff09; - 知乎 (说明&#xff1a;本教程介绍的是安装DeskTop版的系统) 1.官网下载镜像 官方网址: https://ubuntu.com/#download进入官网后会有最新版本的镜像下载地址&#xff0c;如果需要下载最新版本&#xff0c;直接点…

Git_06_创建分支/查看分支

创建分支 # 创建分支的同时&#xff0c;切换到该分支上 > git checkout -b 分支名称 # > git push origin 分支名称查看分支 # 查看本地分支 > git branch # 查看远程分支 > git branch -r # 查看所有分支 > git branch -a删除分支 # 删除本地分支 > git …

分布式应用之监控平台zabbix的认识与搭建

一、监控系统的相关知识 1.1 监控系统运用的原因 当我们需要实时关注与其相关的各项指标是否正常&#xff0c;往往存在着很多的服务器、网络设备等硬件资源&#xff0c;如果我们想要能够更加方便的、集中的监控他们&#xff0c;zabix可以实现集中监控管理的应用程序 监控的…

在Anaconda中安装xgboost(简单高效)

文章目录 一、检查二、打开Anaconda Prompt三、安装四、验证 一、检查 前提条件&#xff1a;windows环境下&#xff0c;anaconda&#xff08;这里指的是Anaconda3&#xff09;已安装&#xff0c;相应的numpy和sicpy也已安装。如果未安装需要先安装这两个库。 二、打开Anaconda…

RapidSSL的便宜单域名https证书

RapidSSL是Geotrust https证书品牌中的一款入门级https证书品牌&#xff0c;目前属于Digicert的子品牌。它是一款提供高性价比和广泛适用范围的https证书&#xff0c;无论是个人还是企业用户都可以轻松申请并快速验证。今天就随SSL盾小编了解RapidSSL旗下的单域名https证书。 …

Redis分布式锁的实现方式、实现原理

目录 一、分布式锁的重要性与挑战1.1 分布式系统中的并发问题竞态条件数据不一致死锁 二、分布式锁的基本原理与实现方式2.1 分布式锁的基本概念2.2 基于数据库的分布式锁原理与实现方式优缺点 2.3 基于缓存的分布式锁原理与实现方式优缺点 三、Redis分布式锁的实现与使用3.1 使…

安科瑞电流隔离传感器 BA穿孔交流电流变送器-安科瑞黄安南

一.产品原理和功能介绍 BA系列产品应用电磁感应原理&#xff0c;对电网中的交流电流进行实时测量&#xff0c;采用精密恒流技术和线性温度补偿技术&#xff0c;将其隔离变换为标准的直流信号输出 采用24伏或12伏安全电压供电&#xff0c;具有过载能力强、高精度、高隔离、高安…

Talk | ICCV’23 清华赵天辰:Ada3D-基于动态推理的3D感知模型压缩及软硬件协同优化

​本期为TechBeat人工智能社区第533期线上Talk&#xff01; 北京时间9月21日(周四)20:00&#xff0c;清华大学博士生—赵天辰的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “Ada3D-基于动态推理的3D感知模型压缩及软硬件协同优化”&#xff0c;他…

JavaScript学习记录 | DOM事件流 事件冒泡-事件捕获-事件委托

目录 DOM事件流常见面试题事件冒泡与事件捕获事件冒泡使用场景事件捕获使用场景事件冒泡和事件捕获区别 事件委托 - 利用事件冒泡机制事件委托应用场景支持事件委托的事件事件委托的优缺点 DOM事件流 DOM事件流的三个阶段&#xff1a;捕获阶段 -> 目标阶段 -> 冒泡阶段 …

浏览器报错内容:Provisional headers are shown

浏览器报错内容&#xff1a;Provisional headers are shown 如下图&#xff1a; 解决方法&#xff1a;nginx 443 启用HTTP/2模式&#xff0c;如下图&#xff1a; server {listen 443 ssl http2;server_name callcenterda.umworks.com;client_max_body_size 200M;ssl_session_…

死锁详细解读

目录 死锁&#xff08;1&#xff09; 一、死锁的定义 二、产生死锁的原因 三、产生死锁的四个必要条件 四、解决死锁的方法 死锁&#xff08;2&#xff09; 第三节 死锁避免 一、死锁避免的概念 二、安全状态与安全序列 三、银行家算法 第四节、死锁的检测与解除 …

Python 打印所有水仙花数

"""打印三位水仙花数介绍&#xff1a;水仙花数是指一个 n 位数&#xff0c;它的每个位上的数字的 n 次幂之和等于它本身。例如&#xff0c;153 是一个三位的水仙花数&#xff0c;因为 (1**3) (5**3) (3**3) 153。下面是一个 Python 程序&#xff0c;用于生成…

LabVIEW开发基于物联网的多功能功率分析仪

LabVIEW开发基于物联网的多功能功率分析仪 根据技术规则&#xff0c;电气元件网络中的单个被创建为在标称正弦波振动制造频率下运行。失真顺序的电流和电压波与正弦波不同&#xff0c;它们或多或少地扭曲成形状。它是由交流网络中非线性组件的存在引起的&#xff0c;例如静态转…