antdVue 自定义table列配置

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

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

<div>
        <a-modal
        title="列配置" 
        :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(){
            //判断是否位0
            if(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].isHide
            if(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.href
                this.$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.dataIndex
                            if(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.data
                        console.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.mfbz.cn/a/598823.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Netty一文搞懂入门篇<随手笔记>

1.Java IO的读写原理 IO是Input和Output的缩写&#xff0c;即输入和输出。用户程序进行IO的读写基本上会用到read和write两大系统调用。 read把数据从内核缓冲区复制到进程缓冲区&#xff0c;write是把数据从进程缓冲区复制到内核缓冲区。 这两大系统的调用都不负责数据在内核…

Jira Server 不维护了,如何将 Jira 平滑迁移到阿里云云效

作者&#xff1a;天彤 Atlassian 在 2020 年官方发布公告&#xff0c;从 2021 年起停止 Jira Server 产品的销售&#xff0c;并且在 2024 年彻底停止 Server 端产品的服务支持&#xff0c;这对于国内使用 Jira 产品的企业和研发团队造成了不小的影响。而此时国内很多 DevOps 产…

LeetCode面试298,二叉树最长连续序列(Python)

开始想着dfs&#xff0c;两种情况 1.以root为根 2.不以root为根 但是这样需要两个dfs分别进行&#xff0c;那么时间复杂度就上去了。 class Solution:def longestConsecutive(self, root: Optional[TreeNode]) -> int:def dfs(root):# 以root为根节点&#xff0c;可以延…

【系统分析师】系统分析部分

文章目录 1、系统分析概述2、详细调查2.1 为什么要做详细调查&#xff1f;2.2 详细调查的原则2.3 详细调查的内容2.4 详细调查的方法 3、现有系统分析3.1 获得系统的物理模型3.2 抽象出现有系统的逻辑模型3.3 建立新系统的逻辑模型3.4 建立新系统的物理模型 4、组织结构分析4.1…

文件夹批量重命名,轻松实现简体中文翻译成繁体中文,文件夹批量改名新体验

文件夹的管理和命名显得尤为重要。你是否曾为了给文件夹取一个合适的名字而 绞尽脑汁&#xff1f;是否因为需要批量修改文件夹名而苦恼不已&#xff1f;现在&#xff0c;我们为你带来一款强大的文件夹批量改名工具&#xff0c;不仅能轻松实现简体中文到繁体中文的转换&#xf…

5月7日监控二叉树+斐波那契数

968.监控二叉树 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 示例 1&#xff1a; 输入&#xff1a;[0,0,null,0,0] 输出&#xff1a;1 解释&#xff…

LeCun转发,AI让失语者重新说话!纽约大学发布全新「神经-语音」解码器 | 最新快讯

新智元报道 编辑&#xff1a;LRT 通过采集皮层电图&#xff08;ECoG&#xff09;的数据信号&#xff0c;模型可以将其转换为可解释的语音参数&#xff08;如音高&#xff0c;响度&#xff0c;共振峰频率等&#xff09;&#xff0c;并合成出既准确又自然的语音波形。 脑机接口&a…

【C++ | 函数】默认参数、哑元参数、函数重载、内联函数

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-05-04 1…

【Flutter】App内购支付集成 Google和Apple支付和服务器验证全流程

Flutter支付集成 前言&#xff1a; 以谷歌内购为例&#xff0c;我们需要做的总共为三步 需要在谷歌市场配置商品&#xff0c;设置测试渠道&#xff0c;配置开发者账号&#xff0c;设置对应权限。配置完商品之后&#xff0c;如何在 Flutter 中获取到商品&#xff0c;购买指定…

如何为数据库中新建用户B复制用户A的表和视图权限?

故事背景&#xff1a; 公司使用的是SQL Server数据库&#xff0c;经常会碰到一种情况&#xff0c;需要为新入职的员工赋予同组内其他同事的权限。 常用方法: 1) 为同一组申请创建统一的Security Group(安全组)&#xff0c;为创建的组分配相关表和视图的访问权限。不管员工入职…

基于POSIX标准库的读者-写者问题的简单实现

文章目录 实验要求分析保证读写、写写互斥保证多个读者同时进行读操作 读者优先实例代码分析 写者优先示例代码分析 实验要求 创建一个控制台进程&#xff0c;此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求进行读写操作。用信号量机制…

FileLink跨网文件交换,推动企业高效协作|半导体行业解决方案

随着信息技术的迅猛发展&#xff0c;全球信息产业已经迎来了前所未有的繁荣与变革。在这场科技革命中&#xff0c;半导体作为信息产业的基础与核心&#xff0c;其重要性日益凸显&#xff0c;半导体的应用场景和市场需求将进一步扩大。 然而&#xff0c;在这一繁荣的背后&#x…

解决 SyntaxError: Unexpected token ‘.‘ 报错问题

这个报错一般是编译问题&#xff0c;浏览器的版本过低没通过代码 解决办法&#xff1a; 在package.json文件中加上这个 "browserslist": ["> 1%","last 2 versions","not dead","not ie < 6","Android > 4&…

源代码防泄露可以通过哪些方法实现?七种有效方法分享

在当今数字化时代&#xff0c;访问安全和数据安全成为企业面临的重要挑战。传统的边界防御已经无法满足日益复杂的内网办公环境&#xff0c;层出不穷的攻击手段已经让市场单一的防御手段黔驴技穷。当企业面临越来越复杂的网络威胁和数据泄密风险时&#xff0c;更需要一种综合的…

stable-diffusion-webui配置

源码地址 https://github.com/AUTOMATIC1111/stable-diffusion-webui.git报错Fresh install fail to load AttributeError: NoneType object has no attribute _id pydantic降级 pip uninstall pydantic pip install pydantic1.10.11记得要把clip-vit-large-patch14放在opena…

Java集合 总结篇(全)

Java集合 集合底层框架总结 List 代表的有序&#xff0c;可重复的集合。 ArrayList -- 数组 -- 把他想象成C中的Vector就可以&#xff0c;当数组空间不够的时候&#xff0c;会自动扩容。 -- 线程不安全 LinkedList -- 双向链表 -- 可以将他理解成一个链表&#xff0c;不支持…

C语言猜数字游戏

用C语言实现猜数字游戏&#xff0c;电脑随机给出一个范围内的数字&#xff0c;用户在终端输入数字&#xff0c;去猜大小&#xff1b;对比数字&#xff0c;电脑给出提示偏大还是偏小&#xff1b;不断循环&#xff0c;直到正确 #include <stdio.h> #include <time.h>…

【系统架构师】-选择题(十一)

1、紧耦合多机系统一般通过&#xff08;共享内存&#xff09;实现多机间的通信。对称多处理器结构&#xff08;SMP&#xff09;属于&#xff08; 紧耦合&#xff09;系统。 松耦合多机系统又称间接耦合系统,—般是通过通道或通信线路实现计算机间的互连。 2、采用微内核的OS结构…

从互联网医院源码到搭建:开发视频问诊小程序的技术解析

如今&#xff0c;视频问诊小程序作为医疗服务的一种新形式&#xff0c;正逐渐受到人们的关注和青睐。今天&#xff0c;小编将为您详解视频问诊小程序的开发流程。 一、背景介绍 互联网医院源码是视频问诊小程序开发的基础&#xff0c;它提供了一套完整的医疗服务系统框架&…

【vue-echarts】 报错问题解决 “Error: Component series.pie not exists. Load it first.“

目录 问题描述解决【解决1】【解决2】 问题描述 使用 vue-echarts 时导入的文件 import VChart from vue-echarts/components/ECharts import echarts/lib/chart/line import echarts/lib/chart/bar import echarts/lib/chart/pie import echarts/lib/component/legend impor…