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

news2024/12/28 20:23:59

 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" 
                    background
                    layout="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>
            <Edit
                v-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编码 还有其他方式比如gpk
              reader.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] === '[') {
                    // 计数器加1
                    count++;
                    // 如果计数器为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.coloradmin.cn/o/1031056.html

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

相关文章

P1827 [USACO3.4] 美国血统 American Heritage(前序 + 中序 生成后序)

P1827 [USACO3.4] 美国血统 American Heritage&#xff08;前序 中序 生成后序&#xff09; 一、前言 二叉树入门题。涉及到树的基本知识、树的结构、树的生成。 本文从会从结构&#xff0c;到完成到&#xff0c;优化。 二、基础知识 Ⅰ、二叉树的遍历 前序遍历&#xff…

CRM软件系统维护客户的主要方法

客户的重要性&#xff0c;相信每一个做企业的人都非常清楚。为了维护好客户&#xff0c;很多企业都使用CRM客户管理系统&#xff0c;建立“以客户为中心”的经营理念&#xff0c;提高企业客户服务水平&#xff0c;进而在提高客户满意度的同时提高企业的盈利。那么&#xff0c;企…

ubuntu、linux in window安装docker教程

1、首先进入管理员权限。 2、更新软件源。 sudo apt update 3、安装一些依赖 sudo apt install apt-transport-https ca-certificates curl software-properties-common 4、为系统添加Docker的密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-k…

28.CSS 渐变圆文本动画

效果 源码 index.html <!doctype html> <html> <head><meta charset="utf-8"><title>Glowing Gradient Circle Text Animation</title><link rel="stylesheet" href="style.css"> </head> &l…

合同被篡改,被变更,被调换风险大?君子签电子合同有效化解

纸质合同签署文件类型多&#xff0c;签署量大&#xff0c;人为干预较多&#xff0c;合同被篡改&#xff0c;被变更&#xff0c;被调换风险大&#xff0c;难以防范和避免。 请注意&#xff0c;出现以下几个情况&#xff0c;代表你已经遭遇合同“调包计”了&#xff01; 1、合…

“undefined reference to XXX“问题总结

"undefined reference to XXX"问题总结 引言 我们在Linux下用C/C工作的时候&#xff0c;经常会遇到"undefined reference to XXX"的问题&#xff0c;直白地说就是在链接(从.cpp源代码到可执行的ELF文件&#xff0c;要经过预处理->编译->链接三个阶…

换台电脑python使用uiautomator2操作逍遥模拟器

前几天写了一篇文章python使用uiautomator2操作雷电模拟器_小小爬虾的博客-CSDN博客 今天用另外一个环境和模拟器再次测试。 环境如下&#xff1a;win7 sp1 64位&#xff1b;Python3.8.10&#xff1b;逍遥模拟器9.0.6&#xff1b;android版本9&#xff1b;逍遥模拟器自带adb版…

【数据结构】顺序表与ArrayList

作者主页&#xff1a;paper jie 的博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精…

2023研究生数学建模D题思路代码 区域双碳目标与路径规划研究

D题思路代码 区域双碳目标与路径规划研究 完整解题思路可看视频&#xff1a; 2023华为杯研赛D题区域双碳目标与路径规划研究&#xff08;附代码全保姆教程&#xff09;_哔哩哔哩_bilibili​www.bilibili.com/video/BV1Cm4y157CH/?spm_id_from333.999.0.0 问题一&#xff1a;…

将序列中的每一行重复扩展为指定数量的行Series.repeat()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将序列中的每一行 重复扩展为指定数量的行 Series.repeat() [太阳]选择题 以下说法正确的是 import pandas as pd s1pd.Series([10, 25, 3]) s1.index [A, B, C] print(【显示】s1为&#xff…

超级好用的高效率记笔记软件

高效率的记录学习笔记&#xff0c;可以帮助我们日后进行知识的回顾、学习及分享&#xff0c;对于有记录学习笔记需求的学生来讲&#xff0c;在日常生活中找一款好用的记录学习笔记的非常有必要的&#xff0c;手机作为一款比较便携的工具&#xff0c;在手机上安装笔记类工具&…

家居行业如何借助AI营销数智化转型?《2023 家居行业AI营销第一课(重庆站)》给你答案

商务部将2023年定为“消费提振年”。作为仅次于汽车消费的家庭第二大消费支出&#xff0c;家居产业的高质量发展与扩大内需提振消费息息相关。随着今年利好政策不断发布&#xff0c;家居建材行业的市场环境及消费潜力得到大幅度改善。 随着ChatGPT等新技术的出现与消费需求升级…

安全基础 --- nodejs沙箱逃逸

nodejs沙箱逃逸 沙箱绕过原理&#xff1a;沙箱内部找到一个沙箱外部的对象&#xff0c;借助这个对象内的属性即可获得沙箱外的函数&#xff0c;进而绕过沙箱 前提&#xff1a;使用vm模块&#xff0c;实现沙箱逃逸环境。&#xff08;vm模式是nodejs中内置的模块&#xff0c;是no…

【腾讯云】打造未来智能应用的基石:腾讯混元大模型

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

vue-cli-service build 不同环境的配置

目录 &#x1f91c; 背景 &#x1f91c; vue-cli-service介绍 &#x1f91c; 环境变量和模式 &#x1f91c; 配置不同模式 &#x1f91c;index.html使用环境变量 &#x1f91c; 验证 &#x1f91c; 参考资料 &#x1f91c; 背景 在项目部署时&#xff0c;我们需要在测试…

如何通过文件自动备份软件进行自动化备份?

​为什么要使用文件自动备份软件 有一位做客户资料保管登记的朋友&#xff0c;每天会在电脑上录入很多新的客户资料&#xff0c;并需要进行相关维护。比如删掉一些取消合作的客户&#xff0c;或者添加一些备注等等。对于像他这种工作性质的人来说&#xff0c;很需要一个可以…

c++ this指针与空指针调用类方法以及常函数

一、this指针 说明 1、c的成员变量与成员内函数是分开存储 2、每一个非静态成员函数只会诞生一份函数实例&#xff0c;多个同类型的队形公用的是同一份成员函数的代码 3、this指向调用这一份成员函数代码的对象实例 4、this是一个隐藏的指向对象实例的一个指针,无需定义直接使…

使用Vue-cli构建spa项目及结构解析

一&#xff0c;Vue-cli是什么&#xff1f; 是一个官方发布的Vue脚手架工具&#xff0c;用于快速搭建Vue项目结构&#xff0c;提供了现代前端开发所需要的一些基础功能&#xff0c;例如&#xff1a;Webpack打包、ESLint语法检查、单元测试、自动化部署等等。同时&#xff0c;Vu…

百度SEO不稳定的原因及解决方法(百度SEO不稳定因素的5大包括)

百度SEO优化不稳定介绍&#xff1a;蘑菇号-www.mooogu.cn 随着百度SEO算法的不断变化和升级&#xff0c;许多网站的SEO排名经常出现不稳定的情况&#xff0c;这种情况在一定程度上影响了网站的流量和排名&#xff0c;导致网站的质量评分降低。因此&#xff0c;深入分析百度SEO…

ubuntu的root用户修改密码失败

解决如下&#xff1a; 查看文件属性是否有a或i lsattr /etc/group /etc/passwd /etc/shadow 移除a和i的属性权限 chattr -ai /etc/group /etc/passwd /etc/shadow 再次使用passwd进行修改密码&#xff0c;就成功了