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.mzph.cn/news/835035.shtml

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

相关文章

在linux里登录远程服务器

在linux里登录远程服务器。在虚拟终端里输入命令&#xff1a; ssh 远程服务器ip -l username 然后输入登录密码&#xff0c;就可以登录到远程服务器的命令行界面。登录方便&#xff0c;字体也可以在本地机的虚拟终端里设置得大一点。 下面是一张截屏图片。

系统Cpu利用率降低改造之路

系统Cpu利用率降低改造之路 一.背景 1.1 系统背景 该系统是一个专门爬取第三方数据的高并发系统&#xff0c;该系统单台机器以每分钟400万的频次查询第三方数据&#xff0c;并回推给内部第三方系统。从应用类型上看属于IO密集型应用,为了提高系统的吞吐量和并发&#xff0c;…

音频数字信号I2S一些知识理解

(1)I2S单向基本传输需要几根线传输音频信号? 3根线 LRCK SCLK(也叫BLK) DATA(单向) (2)如何理解I2S MASTER或者SLAVE的模式&#xff1f; codec的i2s作为slave mode,LRCK和SCLK来自于soc主控端,codec端自动检测MCLK和LRCK codec的i2s作为master mode,codec通过MCLK LRCLKDIV…

CSS-浮动

float (浮动) 作用&#xff1a;盒子的顶点是一样的&#xff0c;具备行内块的特征&#xff0c;能设置宽高 属性&#xff1a;float 属性值&#xff1a;left 浮动在网页左边 right 浮动在网页右边 .a{width: 100px;height: 100px;float:left;background-color: red;}.b…

drawio 网页版二次开发(1):源码下载和环境搭建

目录 一 说明 二 源码地址以及下载 三 开发环境搭建 1. 前端工程地址 2. 配置开发环境 &#xff08;1&#xff09;安装 node.js &#xff08;2&#xff09;安装 serve 服务器 3. 运行 四 最后 一 说明 应公司项目要求&#xff0c;需要对drawio进行二次开发&…

VUE 或 Js封装通用闭包循环滚动函数

1、vue3 闭包滚动函数的使用 js 调用也基本雷同 // 滚动Tab组件const scoreTabRef ref()// 滚动的选项const scrollOption ref({// 滚动的Dom元素scrollDom: null,// 滚动的时间间隔scrollInterval: 1500,// 滚动的距离scrollSep: 100,// 滚动历时时间scrollDuration: 10…

Microsoft Project使用简明教程

一.认识Microsoft Project Microsoft Project 是微软公司开发的项目管理软件&#xff0c;用于规划、协调和跟踪项目的进度、资源和预算&#xff0c;如下图所示&#xff0c;左边是任务的显示&#xff0c;右边是一个日程的显示图&#xff0c;最上方的长方形处在我们项目设定日程…

Python 3 中zip()函数的用法

1 创作灵感 我们在阅读代码的时候&#xff0c;经常会看到zip函数&#xff0c;有的时候还和循环在一起用&#xff0c;今天举几个例子测试一下该函数的用法 2.应用举例 &#xff08;1&#xff09;定义了两个列表一个是num,一个是letter (2)使用zip可以把num列表和letter列表中…

【高阶数据结构】图 -- 详解

一、图的基本概念 图 是由顶点集合及顶点间的关系组成的一种数据结构&#xff1a;G (V&#xff0c; E)。其中&#xff1a; 顶点集合 V {x | x属于某个数据对象集} 是有穷非空集合&#xff1b; E {(x,y) | x,y属于V} 或者 E {<x, y> | x,y属于V && Path(x, y…

pdf编辑软件,四款软件让你轻松玩转PDF编辑!

在信息爆炸的当今时代&#xff0c;PDF格式文档因其跨平台、不易被篡改的特性而深受大家喜爱。然而&#xff0c;如何高效地编辑PDF文档却成为许多人的难题。今天&#xff0c;我将为大家推荐四款实用的PDF编辑软件&#xff0c;让你轻松玩转PDF编辑&#xff0c;告别繁琐操作&#…

Springboot集成Mybatispuls操作mysql数据库-04

MyBatis-Plus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强而不做改变。它支持所有MyBatis原生的特性&#xff0c;因此引入MyBatis-Plus不会对现有的MyBatis构架产生任何影响。MyBatis-Plus旨在简化开发、提高效率&#xff0c;…

【机器学习与实现】线性回归分析

目录 一、相关和回归的概念&#xff08;一&#xff09;变量间的关系&#xff08;二&#xff09;Pearson&#xff08;皮尔逊&#xff09;相关系数 二、线性回归的概念和方程&#xff08;一&#xff09;回归分析概述&#xff08;二&#xff09;线性回归方程 三、线性回归模型的损…

3D Gaussian Splatting for Real-Time Radiance Field Rendering 论文阅读

如此热门的项目&#xff0c;网络上有很多大牛分析了这篇文章的做法&#xff0c;在这里简单记录一下个人粗浅的理解。 关于各种数学表达式的推导&#xff0c;论文和参考资料中都提供了较为详细的解读&#xff0c;本人能力有限&#xff0c;这一部分理解不够深刻&#xff0c;先不做…

【CSDN搜材料的小技巧】怎么快速查到高质量最新的内容

问题描述: 我最近搜CSDN已经搜累了&#xff0c;好多东西明显是有问题的&#xff0c;还有一堆人复制粘贴&#xff0c;从海量文章中提取出最新且高质量文章成了当务之急&#xff01; 解决方案: 我本来想写个爬虫按照文章的收藏或者点赞排序的&#xff0c;无意中看到了这篇文章…

多线程三种实现

多线程 线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。 &#xff08;理解&#xff1a;应用软件中互相独立&#xff0c;可以同时运行的功能&#xff09; 进程 进程是程序的基本执行实体。&#xff08;理解&#…

在windows下安装wsl子系统

一、安装环境 windows规格 版本Windows 10企业版版本号22H2操作系统内部版本19045.4291 二、安装过程 2.1 以管理员身份打开PowerShell&#xff08;win X快捷键&#xff09;&#xff1b; 2.2 输入命令&#xff1a;wsl --list --online&#xff08;简写&#xff1a;wsl -l …

探索 Joomla! CMS:打造个性化网站的利器

上周我们的Hostease客户咨询建站服务。他想要用Joomla建站。Hostease提供免费安装Joomla CMS服务。这可以让客户搭建网站变得更加简单和高效。下面是针对Joomla建站的一些使用心得。 Joomla CMS是一款开放自由的软件&#xff0c;为用户提供了创建和维护网站的自由度。它经过全…

鸿蒙应用开发DevEco Studio工程目录模块介绍

面向开发者&#xff0c;HarmonyOS 推出了 DevEco Studio 和 Dev Device Tool 两款开发工具&#xff0c;前者目前迭代至 3.1 版本&#xff08;对外开放版本&#xff09;&#xff0c;用于开发 HarmonyOS 应用&#xff1b;后者用于开发智能设备 应用的工程主体结构如上图 在这里我…

编写一个C#程序,实现音乐文件的播放功能

一、作业要求 要求1&#xff1a; 1. 程序应能够读取MP3文件&#xff0c;并播放其中的音频。 2. 程序应能够处理可能出现的异常&#xff0c;如文件不存在、文件读取错误等。 3. 程序应具有良好的用户界面&#xff0c;方便用户进行操作。 4. 程序应具有良好的兼容性&#xf…

数据可视化训练第三天(富豪借钱问题可视化)

题目 一个穷人到富人那里去借钱&#xff0c;原以为富人不愿意&#xff0c;哪知富人一口答应了下来&#xff0c; 但提出了如下条件&#xff1a; 在30天中&#xff0c;富人第一天借给穷人1万元&#xff0c;第二天借给2万&#xff0c;以后每天所借的钱数都比上一天的多一万&…