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

 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…

2023年中国研究生数学建模竞赛赛题浅析

为了更好的帮助大家第一天选题&#xff0c;这里首先为大家带来各个赛题的赛题浅析&#xff0c;分析对应赛题之后做题阶段可能会遇到的各种难点。 稍后会带来D题的详细解析思路&#xff0c;以及相关的其他版本解题思路 成品论文等资料。 赛题难度评估&#xff1a;A、B>C>…

大数据学习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…

云原生:构建现代化应用的新篇章

云原生&#xff1a;构建现代化应用的新篇章 随着技术的快速发展&#xff0c;我们进入了一个全新的数字化时代。在这个时代&#xff0c;云原生作为一种新兴的技术趋势&#xff0c;正逐渐改变着我们对构建现代化应用的认识。云原生是容器、微服务、DevOps、持续交付等技术的集合…

Java中List转字符串的方法

一、使用String.join方法 在Java 8之后&#xff0c;String类增加了一个静态方法join()&#xff0c;可以方便地将列表中的元素连接成字符串。 // 创建List List<String> list Arrays.asList("Google", "Baidu", "Taobao"); // 以逗号分隔…

代码随想录算法训练营19期第59天

503.下一个更大元素II 代码随想录 初步思路&#xff1a;拼接两个一摸一样的数组&#xff0c;再使用单调栈的方法 总结&#xff1a;更高效的方法是在遍历的过程中模拟走了两边数组 dp [-1] * len(nums)stack []for i in range(len(nums)*2):while(len(stack) ! 0 and num…

[效率提升]使用shell脚本完成一些git操作

[效率提升]使用shell脚本完成一些git操作 根据分支名自动Add和Commit并Push到远程开发分支 例如开发分支名为: feature-xxx功能 Commit信息为&#xff1a;xxx功能 #!/bin/bash# 获取当前分支名称 current_branch$(git rev-parse --abbrev-ref HEAD)echo "current bran…

《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;对两…

linux 数据恢复

Linux误删除及误格式化的数据恢复方案针对的文件系统&#xff1a; 1 、基于EXT2/EXT3/EXT4文件系统 &#xff1b; 2 、基于Reiserfs文件系统&#xff1b; 3 、基于Xfs文件系统。 Linux误删除及误格式化的数据恢复解决方案&#xff1a; 一、故障检测&#xff1a; 1、检测是…

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 …

js同级弹窗实现数据传输修改

window.postMessage 是一种用于实现跨窗口通信的 HTML5 特性。它允许在不同窗口或 iframe 之间安全地传递数据&#xff0c;即使这些窗口来自不同的域名。 window.postMessage 方法接受两个参数&#xff1a; message&#xff1a;要发送的消息&#xff0c;可以是一个字符串或一…

为何学linux及用处

目前企业使用的操作系统无非就是国产类的&#xff0c;windows和linux类。我们要提升自己的技能&#xff0c;需要学习这两款。我记得在大学时期&#xff0c;学习过windows以及linux&#xff0c;但当时觉得又不常用&#xff0c;就学的模棱两可。毕业之后&#xff0c;你会发现&…

分布式应用之监控平台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证书。 …