antdVue 自定义table列配置

最近做项目的时候需要对页面的table进行列配置的需求

在这里插入图片描述
子组件

<div><a-modaltitle="列配置" :visible="visible" :closable="false" :footer="null"width="800px" height="448px"><div><a-row><a-col :span="18" style="padding: 0 10px 0 0;"><a-table style="height: 400px"  :columns="columns" ref="alarmTable":customRow="customRow" :data-source="tabkeData" :pagination="false"><span slot="showOrhide" slot-scope="text, record"><img src="@/assets/column/Vector-1.png" alt="" v-if="record.isHide" style="width:15px"><img src="@/assets/column/Vector.png" alt="" v-else style="width:15px"></span></a-table></a-col><a-col :span="6"><div class="btns" @click="upColumn"><img src="@/assets/column/Group.png" alt="" class="icon">上移</div><div class="btns" @click="downColumn"><img src="@/assets/column/Group-1.png" alt="" class="icon">下移</div><div class="btns" @click="showOrhide"><img src="@/assets/column/Group-2.png" alt="" class="icon">显示/隐藏</div><div class="btns" @click="showWidth"><img src="@/assets/column/Vector-2.png" alt="" class="icon">修改列宽</div><div class="btns" @click="showTitle"><img src="@/assets/column/Vector-2.png" alt="" class="icon">修改标题</div><div class="btns" @click="coverData"><img src="@/assets/column/Vector-3.png" alt="" class="icon">还原默认值</div><div class="btns" @click="saveColumn" style="margin-top: 50px;"><img src="@/assets/column/Vector-4.png" alt="" class="icon">保存</div><div class="btns" @click="handleCancel"><img src="@/assets/column/Vector-5.png" alt="" class="icon">关闭</div></a-col></a-row></div></a-modal><a-modal v-model="widthModel" title="设置列宽" @ok="saveWidth"><div><a-input type="number" onmousewheel="return false" placeholder="请输入列宽" style="width: 200px;" onkeypress="return(/[\d\.]/.test(String.fromCharCode(event.keyCode)))"v-model="wData"/></div></a-modal><a-modal v-model="titleModel" title="设置标题" @ok="saveTitle"> <div><a-input placeholder="请输入标题" style="width: 200px;" v-model="tData"/></div></a-modal></div>
<script>
const columns = [{title:'序号',dataIndex: 'seq',key:'seq'},{title: 'ID',dataIndex: 'dataIndex',key: 'dataIndex',},{title: '标题',dataIndex: 'title',key: 'title',},{title: '列宽',dataIndex: 'width',key: 'width',},{title: '显示',key: 'isHide',scopedSlots: { customRender: 'showOrhide' },},
]
export default{props:{configShow:{type:Boolean,default:true},data:{type:Array,default:true},menuId:{type:String,default:true},columnsLocal:{type:Array,default:true}},data(){return{visible:false,selectedRowKeys:[],tabkeData:[],columns,c_index:'',widthModel:false,wData:'',titleModel:false,tData:'',default:[]//默认table}},created(){this.columnQuery();},// 挂载后activated() {// console.log('jinlai');// this.columnQuery();},watch:{configShow(val){this.visible = val},data(val){// this.tableData = val;}},methods:{showWidth(){this.wData = this.tabkeData[this.c_index].width;this.widthModel = true},saveWidth(){//判断是否位0if(this.wData == 0){this.$message.error('不能为0!')return }if(this.wData < 50){this.$message.error('不能小于50!')return }if(this.wData == ''){this.$message.error('不能为空!')return }this.$set(this.tabkeData[this.c_index],'width',parseInt(this.wData));this.widthModel = false;},showTitle(){this.tData = this.tabkeData[this.c_index].title;this.titleModel = true;},saveTitle(){if(this.tData == ''){this.$message.error('标题不能为空!')return}this.$set(this.tabkeData[this.c_index],'title',this.tData);this.titleModel = false;},customRow(record, index){return {style: {'background-color': this.c_index=== index ? '#Bae2d8' : ''},on: {click: event => {this.c_index = index}}}},handleCancel(){this.$emit('configCancle',false)},coverData(){this.tabkeData = this.resetData(this.columnsLocal);window.location.href = window.location.href},isLastIndex(){return this.c_index === this.tabkeData.length - 1 || this.c_index === 0;},isFirstIndex(){return this.c_index === 0 || this.c_index === 1},upColumn(){let tag = this.isFirstIndex();if(tag){this.$message.error('不能再操作啦!')}else{let index = this.c_index;let editColumn = this.tabkeData;let t = editColumn[index];editColumn[index] = editColumn[index-1];editColumn[index-1] = t;editColumn[index].seq = index+1;editColumn[index-1].seq = index;this.c_index = index-1;this.$delete(this.tabkeData, 'editColumn')this.$set(this.tabkeData,'editColumn',editColumn);}},downColumn(){let tag = this.isLastIndex();if(tag){this.$message.error('不能再操作啦!')}else{let index = this.c_index;let editColumn = this.tabkeData;let t = editColumn[index];editColumn[index] = editColumn[index+1];editColumn[index+1] = t;editColumn[index].seq = index+1;editColumn[index+1].seq = index+2;this.c_index = index+1;this.$delete(this.tabkeData, 'editColumn')this.$set(this.tabkeData,'editColumn',editColumn);}},showOrhide(){let idx = this.c_index;let hide = this.tabkeData[this.c_index].isHideif(idx<=1&&hide==false){this.$message.error('无法隐藏!')return}this.tabkeData[idx].isHide = !hide;},async saveColumn(){let col = this.tabkeData;col.map((item,index) => {if(item.scopedSlots){item.scopedSlots = JSON.stringify(item.scopedSlots)}})let res = await this.axios.post('base/v1/masterData/tableColumn/save',{userId: this.$store.state.user.id,menuId: this.menuId,columns:col})if(res.data.code == 1){this.$message.success('保存成功!');this.tabkeData.map(k=>{if(k.scopedSlots){k.scopedSlots = JSON.parse(k.scopedSlots)}else{delete k.scopedSlots}})this.$emit('configCancle',false);this.$emit('cover',[]);window.location.href = window.location.hrefthis.$emit('cover', this.tabkeData.filter(i=>{return i.isHide==false}));}else{this.$message.error(res.data.messageDetail)}},async columnQuery(){//获取当前菜单的列配置 如果没有 那么默认取当前页面的 如果有那么覆盖this.axios.post('xxxxxx'/xxxxxxx/xxxxxx',{"userId": this.$store.state.user.id,"menuId": this.menuId}).then(res => {if(res.data.code == 1){if(res.data.result.length>0){res.data.result.map((item,index) => {//覆盖本地列配置item.key = item.dataIndexif(item.scopedSlots){item.scopedSlots = JSON.parse(item.scopedSlots)console.log(item.scopedSlots,'scopedSlots');}else{delete item.scopedSlots}})this.tabkeData = res.data.result;console.log( res.data.result,'result');this.$emit('cover', res.data.result.filter(i=>{return i.isHide==false}));}else{//没有查询到数据那么判定当前没有配置过 所以第一次是取本地的数据//this.tableData = this.dataconsole.log(this.columnsLocal,'this.columnsLocal---')let c_ary = this.resetData(this.columnsLocal);this.tabkeData = c_ary;this.$emit('cover', this.tabkeData.filter(i=>{return i.isHide==false}));//在本地保存一套默认的table// this.default = c_ary}}})},resetData(e){let newAry = []e.map((item,index) => {let obj = {align:item.align||'',authority:item.authority||'',dataIndex:item.dataIndex||item.key,title:item.title,ellipsis:true,isFixed:false,is_Default:true,isHide:false,seq:index+1,width:item.width,remark:item.remark||'',key:item.key||item.dataIndex}if(item.scopedSlots){obj.scopedSlots = {"customRender":obj.dataIndex}}newAry.push(obj)})return newAry;}}
}
</script>

子组件的有一部分代码应该是不必要的 遇到的难题是在于子组件数据更新了之后父组件数据更新了但是拖拽的功能没办法同时更新渲染 最后发现如果需要同时更新视图的话 是需要用到this.$set这个办法的 set方法没办法整个数组都更新 所以最后循环遍历更新 不知道有没有更好的办法 如果有 可以留言告诉我 谢谢~

父组件引用

<columnConfig :configShow="configShow" :data="columns" :columnsLocal="columnsLocal":menuId="menuId" @configCancle="(e)=>{configShow=e}" @cover="coverData"></columnConfig>

configShow 定义弹框隐藏显示 columns传给子组件table的列配置数据 columnsLocal本地的列配置数据 初始化的时候会查询这个菜单是否有进行列配置过 如果没有那么就取本地的列配置 menuId 菜单id

customRow 这个方法也可以操作列配置显示隐藏 但是会有一个问题 确实是把head隐藏了 但是隐藏了之后原有的head还是会占位子 没有那么灵活 所以不建议用这个办法

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

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

相关文章

【完美解决】使用git时候出现error setting certificate verify locations: CAfile:问题

1、出现场景&#xff1a; 在使用idea的时候&#xff0c;进行git下的push&#xff0c;出现下面的错误&#xff1a; 2、原因分析&#xff1a; 可能因为重装过系统&#xff0c;或者是安装git的位置发生了变化等情况出现。 3、解决方案&#xff1a; 找到git的安装路径&#xf…

Java中Maven的依赖管理

依赖介绍 是指当前项目运行所需要的jar包&#xff0c;一个项目中可以引入多个依赖 配置 在pom.xml中编写<dependencies>标签 在<dependencies>中使用<dependency>引入标签 定义坐标的groupId、rtifactId、version 点击刷新按钮、引入新坐标 例如引入下…

运维实施工程师之Linux服务器全套教程

一、Linux目录结构 1.1 基本介绍 Linux 的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层是根目录“/”&#xff0c;然后在此目录下再创建其他的目录。 在 Linux 世界里&#xff0c;一切皆文件&#xff08;即使是一个硬件设备&#xff0c;也是使用文本来标…

Android(一)

坏境 java版本 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 进入安卓官网下载 勾选协议 next 如果本地有设置文件&#xff0c;选择Config or installation folder 如果本地没有设置文件&#xff0c;选择Do not import settings 同意两个协议 耐…

接入大量设备后,视频汇聚系统EasyCVR安防监控视频融合平台是如何实现负载均衡的?

一、负载均衡 随着技术的不断进步和监控需求的日益增长&#xff0c;企业视频监控系统的规模也在不断扩大&#xff0c;接入大量监控设备已成为一项常态化的挑战。为确保企业能够有效应对这一挑战&#xff0c;视频汇聚系统EasyCVR视频融合平台凭借其卓越的高并发处理能力&#x…

Pandas入门篇(三)-------数据可视化篇3(seaborn篇)(pandas完结撒花!!!)

目录 概述一、语法二、常用单变量绘图1. 直方图&#xff08;histplot&#xff09;2. 核密度预估图&#xff08;kdeplot&#xff09;3. 计数柱状图&#xff08;countplot&#xff09; 三、常用多变量绘图1.散点图(1) scatterplot(2)regplot 散点图拟合回归线(3)jointplot 散点图…

2024年Q1脱毛膏线上市场(京东天猫淘宝)销量销额排行榜

鲸参谋监测的2024年Q1季度线上电商平台&#xff08;天猫淘宝京东&#xff09;脱毛膏行业销售数据已出炉&#xff01; 根据鲸参谋数据显示&#xff0c;今年Q1季度在线上电商平台&#xff08;天猫淘宝京东&#xff09;&#xff0c;脱毛膏的销量累计接近220万件&#xff0c;环比增…

开源代码分享(28)-含分布式光伏的配电网集群划分和集群电压协调控制

参考文献&#xff1a; [1] Chai Y , Guo L , Wang C ,et al.Network Partition and Voltage Coordination Control for Distribution Networks With High Penetration of Distributed PV Units[J].IEEE Transactions on Power Systems, 2018:3396-3407.DOI:10.1109/TPWRS.2018…

OFDM802.11a的FPGA实现(九)星座图映射(含verilog和matlab代码)

目录 1. 前言2. 调制2.1 QAM调制2.2 64-QAM 调制2.3 16-QAM 调制 3.模块实现4.Matlab仿真5.ModelSim仿真6.verilog代码 原文连接&#xff08;相关文章合集&#xff09;&#xff1a; OFDM 802.11a的xilinx FPGA实现 1. 前言 在上一篇博客当中&#xff0c;已经完成了数据域的交织…

计算机毕设

随着社会和国家的重视&#xff0c;大学对于大学生毕业设计越来越重视。 做软件设计设计方面&#xff0c;前后端分离是必不可少的&#xff0c;代码管理工具&#xff0c;前后端接口测试是项目中必须要用到的工具。做大数据设计方面&#xff0c;主要是要用到爬虫进行数据爬取&…

Unity初级---初识生命周期

1. Awake() &#xff1a;唤醒函数&#xff0c;最先执行的函数&#xff0c;只执行一次&#xff0c;当脚本文件挂载的对象被激活时调用 2. OnEnable() &#xff0c;OnDisable()&#xff1a;当脚本启用和禁用时触发&#xff0c;可执行多次&#xff0c;触发的前提是脚本挂载的对象…

奥威-金蝶BI现金流量表模板,可借鉴、可套用

企业现金流一旦出了问题都是大问题&#xff0c;会直接影响到企业的日常运作&#xff0c;甚至直接关系到企业能不能继续存活&#xff0c;因此现金流量表是企业财务分析中重要报表之一&#xff0c;也是企业监控财务监控情况的重要手段之一。那么这么重要的一份现金流量表该怎么做…

大模型模型简化机器人训练;简单易用的 3D 工具Project Neo;特斯拉放出了擎天柱机器人最新训练视频

✨ 1: DrEureka 利用大语言模型自动化将机器人仿真环境训练结果转移到真实世界 DrEureka是一种利用大型语言模型&#xff08;LLMs&#xff09;自动化和加速从仿真&#xff08;sim&#xff09;到现实世界&#xff08;real&#xff09;转移的技术。在机器人技能学习领域&#x…

线程池(一)

1.线程池的基本概念 1.1 什么是线程池&#xff1a; 线程池是一种利用池化技术思想来实现的线程管理技术&#xff0c;主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。我们可以创建线程池来复用已经创建的线程来降低频繁创建和销毁线程所带来的…

学习强国手机助手

前景&#xff1a; 用手机刷学习强国时要一直盯着手机&#xff0c;总感觉费时费劲&#xff0c;刚好最近学习python写个小工具帮忙自动学习&#xff0c;实现了文章和视频学习&#xff0c;答题类不一定都能正确。上班时电脑连着USB就可以放那&#xff0c;自己可以上班干自己事情。…

内网端口转发与代理

思路&#xff1a;渗透的前提是双方能够建立通信。目前无法和win7建立通信&#xff0c;但是拿到了windows2003的权限&#xff0c;所以可以在Windows2003主机上面建立节点&#xff0c;作为跳板机去访问到内网。 目前状态&#xff1a;控制win2003&#xff08;IP&#xff1a;192.1…

扩展学习|一文读懂知识图谱

一、知识图谱的技术实现流程及相关应用 文献来源&#xff1a;曹倩,赵一鸣.知识图谱的技术实现流程及相关应用[J].情报理论与实践,2015, 38(12):127-132. &#xff08;一&#xff09;知识图谱的特征及功能 知识图谱是为了适应新的网络信息环境而产生的一种语义知识组织和服务的方…

第8篇:创建Nios II工程之读取Switch的值<一>

Q&#xff1a;本期我们再添加一个PIO组件设为输入&#xff0c;创建Nios II工程读取输入值显示在LED上。 A&#xff1a;在前2期创建的控制LED工程的Platform Designer系统基础上再添加一个PIO核&#xff0c;参数设置为18位和单向输入模式&#xff0c;表示DE2-115开发板上的18个…

Ubuntu进行换源

各种源大全 在此地 // 此源均只适用Ubuntu 18.04 版本&#xff0c;其他版本需要修改 bionic 为对应的Ubuntu版本#阿里云源地址 deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security ma…

Anaconda删除虚拟环境目录pkgs和envs|conda瘦身

这个文件夹里面是专门放不同环境中的包的&#xff0c;只是没有区分环境&#xff0c;都混在一起了&#xff0c; 一般在想要删除一个虚拟环境&#xff0c;除了在命令行中输入conda remove -n your_env_name(虚拟环境名称) --all 然后在envs中删除虚拟环境的文件夹&#xff0c; 还…