el-table列的显示与隐藏

news2024/11/23 19:52:28
  • 需求:实现 表字段的显示与隐藏。
  • 效果图 在这里插入图片描述

代码实现

写在前面

  • 首先 我部分字段有自定义的排序逻辑,和默认值或者 数据的计算 所以是不能简单的使用 v-for 循环column 。
  • 然后 我需要默认展示一部分字段,并且 当表无数据时 提示不能 显示隐藏 字段。
  • 做一个类表单的设计,在提交的时候才做数据变更,并且添加搜索。

功能实现

因为每个字段的处理不尽相同,所以我采用 v-if 进行控制(注意 v-if 对dom的开销较大,⚠️多字段)。

  1. 先设置固化数据
  2. 设置字段信息
  3. 添加按钮和 el-popover
  4. 相关函数添加和调试
  5. 添加搜索框
  6. 函数添加
  1. 先设置固化数据
data() {
	return {
	    // 搜索框的输入
	    popoverSearchQuery: '',
	    // el-table 的加载值
	    reload: 1,
	    // 是否打开 el-popover
	    popoverVisible: false,
	    // 选中的列对象数组
	    selectColumns: [], 
	    // 未选中的列对象数组
	    unSelectColumns: [], 
	    // checkbox 的model
	    tempSelectColumns: [], 
	    // 固化的表字段,默认值设置
	    columnSetting: [
	        // {prop: 'userChineseName', label: '人员', isShow: true},
	        {prop: 'onDutyDays', label: '实际出勤天数', isShow: true},
	        {prop: 'avgDutyMinutesPerDutyDay', label: '平均每日出勤时长(小时)', isShow: true},
	        {prop: 'avgTaskMinutesPerDutyDay', label: '平均每日任务时长(小时)', isShow: true},
	        {prop: 'taskNum', label: '任务数', isShow: true},
	        {prop: 'bugOverview', label: '产出Bug', isShow: true},
	        {prop: 'caseOverview', label: '产出Case', isShow: true},
	        {prop: 'codeOverview', label: '产出代码', isShow: true},
	        {prop: 'userGroupName', label: '当前所属团队', isShow: false},
	        {prop: 'userLevel', label: '人员职级', isShow: false},
	        {prop: 'theoreticalOnDutyDays', label: '应出勤天数', isShow: false},
	        {prop: 'otDays', label: '加班天数', isShow: false},
	        {prop: 'absenteeismDays', label: '旷工天数', isShow: false},
	        {prop: 'afterPunchDays', label: '补卡天数', isShow: false},
	        {prop: 'tagCount', label: '标注件数', isShow: false},
	        {prop: 'rewardTagCount', label: '悬赏数', isShow: false}
	    ]
	}
}
  1. 设置字段信息
    要明确一点:要不要有默认展示字段(即:当所有字段不勾选时,展示什么字段数据)
<!-- 人员默认展示,即对该字段不做判断 -->
<el-table-column
    label="人员"
    width="200px"
    align="center"
    fixed="left"
>
    <template slot-scope="scope">
        {{ `${scope.row.userChineseName}(${scope.row.username})` }}
    </template>
</el-table-column>

<!-- v-if实现字段的显示隐藏 参数为prop或者唯一值即可 -->
<el-table-column
    v-if="showColumn('onDutyDays')"
    label="实际出勤天数"
    align="center"
    prop="onDutyDays"
    sortable="custom"
    min-width="80"
>
<template slot-scope="scope">
        <div>
            {{ scope.row.onDutyDays }}
        </div>
    </template>
</el-table-column>
  1. 添加页面和触发按钮(搜索框和 checkbox)
<!--添加字段筛选-->
<div>
    <el-button
        type="text"
        plain
        class="custom-button"
        style="border: none"
        icon="el-icon-s-tools"
        size="mini"
        @click="openSelectPopover"
    >筛选字段</el-button>
    <el-popover
        v-model="popoverVisible"
        placement="bottom-end"
        trigger="click"
        class="my-popover"
    >
        <!-- 搜索 -->
        <!-- 搜索框容器,使用position: sticky来使其在页面滚动时保持在顶部 -->
        <div class="search-bar-container" style="position: sticky; top: 0; z-index: 10; background-color: white;">
            <el-input
                v-model="popoverSearchQuery"
                suffix-icon="el-icon-search"
                placeholder="搜索"
                clearable
                @suffix-click="handlePopoverSearchQuery"
            ></el-input>
        </div>
        <div class="columns-filter">

            <!-- 已选中的项 -->
            <div v-if="selectColumns.length > 0">
                <h3 style="margin-top: -10px;color: #d76969;">已选择</h3>
                <div v-for="(column, index) in selectColumns" :key="column.prop">
                    <el-checkbox
                        v-model="tempSelectColumns"
                        :label="column"
                        :value="column"
                        @change="selectHandleCheckboxChange(column)"
                    >{{ column.label }}</el-checkbox>
                </div>
                <hr> <!-- 已选中与未选中之间的横线 -->
            </div>
            <!-- 未选中的项 -->
            <div v-for="(column, index) in unSelectColumns" :key="column.prop">
                <el-checkbox
                    v-model="tempSelectColumns"
                    :label="column"
                    :value="column"
                    @change="selectHandleCheckboxChange(column)"
                >{{ column.label }}</el-checkbox>
            </div>
            <br>
            <div slot="footer" style="display: flex; justify-content: center;">
                <el-button
                    icon="el-icon-close"
                    size="mini"
                    @click="popoverVisible = false"
                >取 消</el-button>
                <el-button
                    size="mini"
                    icon="el-icon-check"
                    type="primary"
                    @click="confirmSelection"
                >确 定</el-button>
            </div>

        </div>
    </el-popover>
</div>

<!--样式 -->
<style lang="scss" scoped>
// 按钮样式设计, 右上角
.custom-button{
  float: right;
  margin-right: 50px;
  margin-top: -6px;
  font-size: 13px;
}
// 鼠标悬浮 改变背景色
.custom-button:hover {
  background-color: transparent;
  color: #ad64a4;
}
// popover位置设置
.my-popover {
  float: right;
  margin-right: 130px;
  margin-top: 20px;
}
// popover 内部设置最高和滚动条
.columns-filter {
  max-height: 270px;
  overflow-y: auto;
  padding: 10px;
  font-size: 15px;
}
</style>
  1. 相关函数添加和调试
// input 值发生变动就进行搜索
watch: {
    popoverSearchQuery(newVal) {
        if (!newVal) {
            this.resetColumns();
        }
        else {
            this.filterColumns();
        }
    }
}
// 初始化
created() {
    this.initColumn();
},
methods: {
	// 搜索相关-前端实现
    handlePopoverSearchQuery() {
        this.filterColumns();
    },
    filterColumns() {
        this.selectColumns = this.columnSetting.filter(column => column.isShow && column.label.includes(this.popoverSearchQuery));
        this.unSelectColumns = this.columnSetting.filter(column => !column.isShow && column.label.includes(this.popoverSearchQuery));

        if (!this.popoverSearchQuery) {
            this.resetColumns();
        }
    },
    resetColumns() {
        this.selectColumns = this.columnSetting.filter(column => column.isShow);
        this.unSelectColumns = this.columnSetting.filter(column => !column.isShow);
    },
    // 初始化 给 选中和未选中赋值
    initColumn() {
        this.selectColumns = this.columnSetting.filter(column => column.isShow);
        this.unSelectColumns = this.columnSetting.filter(column => !column.isShow);
        // 设置checkbox中值为已选中的值
        this.tempSelectColumns = [...this.selectColumns];
    },
    // 计算是否需要展示
    showColumn(currentColumn) {
        return this.columnSetting.find(item => item.prop === currentColumn).isShow;
    },
    // onclick 按需 添加逻辑,如果不需要 点确定再触发方法 就可以将  confirmSelection 拿到 该函数中。
    selectHandleCheckboxChange(column) {
    },
    // 打开|关闭 popover
    openSelectPopover() {
        if (this.gridData.length < 1) {
            Message.warning('当前列表数据,暂无法使用筛选功能~ ');
            return;
        }
        if (this.popoverVisible) {
            this.popoverVisible = false;
        }
        else {
            this.popoverVisible = true;
            this.popoverSearchQuery = '';
        }
    },
    // 触发数据 处理 
    confirmSelection() {
        const unSelectColumns = this.columnSetting.filter(col =>
            !this.tempSelectColumns.some(tsc => tsc.prop === col.prop)
        ).map(col => ({...col, isShow: false}));

        this.unSelectColumns = unSelectColumns;
        // 更新tempSelectColumns的isShow
        this.tempSelectColumns.forEach(tsc => {
            tsc.isShow = true;
        });
        this.selectColumns = this.tempSelectColumns;
        // 更新columnSetting
        this.columnSetting = [...this.tempSelectColumns, ...unSelectColumns];
        // 这里可以添加额外的处理逻辑,比如发送请求等
        this.popoverVisible = false;
    }
}

fix:

提交 确定 之后 表格会闪烁一下 再显示字段。这是因为dom要重新加载 被销毁的元素。
解决方案 :

el-table 添加 :key=“reload”

<el-table
    :key="reload"
    
    style="margin-right: 30px"
    :header-row-style="{
        background: '#f5f5f5',
        padding: '0',
        color: 'black',
        fontSize: '12px',
    }"
    
>
</el-table>
watch: {
    columnSetting (newVal) {
        // 解决表格闪烁
        this.reload = Math.random();
    }
}

end

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

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

相关文章

HTTP 缓存

缓存 web缓存是可以自动保存常见的文档副本的HTTP设备&#xff0c;当web请求抵达缓存时&#xff0c;如果本地有已经缓存的副本&#xff0c;就可以从本地存储设备而不是从原始服务器中提取这个文档。使用缓存有如下的优先。 缓存减少了冗余的数据传输缓存环节了网络瓶颈的问题…

学习大数据DAY21 Linux基本指令2

目录 思维导图 搜索查看查找类 find 从指定目录查找文件 head 与 tail 查看行 cat 查看内容 more 查看大内容 grep 过滤查找 history 查看已经执行过的历史命令 wc 统计文件 du 查看空间 管道符号 | 配合命令使用 上机练习 4 解压安装类 zip unzip 压缩解压 tar …

google 浏览器插件开发简单学习案例:TodoList

参考&#xff1a; google插件支持&#xff1a; https://blog.csdn.net/weixin_42357472/article/details/140412993 这里是把前面做的TodoList做成google插件&#xff0c;具体网页可以参考下面链接 TodoList网页&#xff1a; https://blog.csdn.net/weixin_42357472/article/de…

Web前端:HTML篇(一)

HTML简介&#xff1a; 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。 您可以使用 HTML 来建立自己的 WEB 站点&#xff0c;HTML 运行在浏览器上&#xff0c;由浏览器…

android studio中svn的使用

第一步&#xff0c;建立一个项目。 第二步&#xff0c;share project。 第三步&#xff0c;选择存放的位置&#xff0c;然后添加提交信息&#xff0c;最后点击share。这样就可以在svn上面看到一个空的项目名称。 第四步&#xff0c;看到文件变成了绿色&#xff0c;点击commit图…

驾驭云原生日志洪流:高效分析与管理的策略集

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、日志管理在云原生架构中的重要性 2、云原生环境的特…

Open-TeleVision复现及机器人迁移

相关信息 标题 Open-TeleVision: Teleoperation with Immersive Active Visual Feedback作者 Xuxin Cheng1 Jialong Li1 Shiqi Yang1 Ge Yang2 Xiaolong Wang1 UC San Diego1 MIT2主页 https://robot-tv.github.io/链接 https://robot-tv.github.io/resources/television.pdf代…

Java | Leetcode Java题解之第273题整数转换英文表示

题目&#xff1a; 题解&#xff1a; class Solution {String[] singles {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};String[] t…

Linux下安装Redis(超简单)

1.下载 选着自己需要下载的版本后&#xff0c;右击选择复制链接&#xff0c;然后利用命令进行下载&#xff0c;进入Xshell控制台&#xff0c;输入wget将复制的链接粘帖上&#xff0c;这里我选择的是6.0.6版本。 命令如下&#xff1a; wget https://download.redis.io…

QML学习——Qt Quick Controls 1 Examples Calendar/FileSystemBrowser(九)

02 File System Browser Show: Notes: 使用了自定义的继承自QFileSystemModel的类&#xff0c;在原有的基础上新加了角色(role)&#xff0c;并且重写了QFileSystemModel中的data函数、及角色和字符串描述对应的哈希表&#xff1b; 使用系统的文件资源管理器打开该文件的链接&…

资产拆分、资产分割的操作,事务代码ABUMN

在公司常见的业务运行中可能会有这样的场景&#xff1a;资产A 需要拆分成资产B 和 C。这个时候就需要使用到资产分割或者资产转移的操作 &#xff0c;事务代码ABUMN。 我司的实际业务场景是这样的&#xff0c;当初想分别入账给A和B的资产。一年之后发现&#xff0c;当时操作错误…

高清录屏无压力,这四款软件助你轻松搞定

现在不论是教育、娱乐还是工作电脑怎么录屏都成为这些领域里不可或缺的一部分。掌握录屏软件&#xff0c;也能成为个人的软实力之一哦&#xff0c;下面我介绍几款可以快速上手的录屏软件来为你增加实力。 1、福晰REC大师 这款软件我是觉得他是我最快上手的一个工具&#xff0…

Unity UGUI 之 Dropdown

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 1.Dropdown是什么 下拉列表 2.重要参数 首先这些参数和Button差不多&#xff0c;不过多…

昇思MindSpore学习入门-格式转换

MindSpore中可以把用于训练网络模型的数据集&#xff0c;转换为MindSpore特定的格式数据&#xff08;MindSpore Record格式&#xff09;&#xff0c;从而更加方便地保存和加载数据。其目标是归一化用户的数据集&#xff0c;并进一步通过MindDataset接口实现数据的读取&#xff…

基于微信小程序+SpringBoot+Vue的校园自助打印系统(带1w+文档)

基于微信小程序SpringBootVue的校园自助打印系统(带1w文档) 基于微信小程序SpringBootVue的校园自助打印系统(带1w文档) 管理信息可以处理复杂的信息从而提高用户的工作效率&#xff0c;减少失误。所以本基于Vue和微信小程序的校园自助打印系统的开发非常有意义&#xff0c;本系…

科研绘图系列:R语言TCGA分组饼图(multiple pie charts)

介绍 在诸如癌症基因组图谱(TCGA)等群体研究项目中,为了有效地表征和比较不同群体的属性分布,科研人员广泛采用饼图作为数据可视化的工具。饼图通过将一个完整的圆形划分为若干个扇形区域,每个扇形区域的面积大小直接对应其代表的属性在整体中的占比。这种图形化的展示方…

react入门到实战-day2-7.21

昨天晚上刚学完已经一点了&#xff0c;来不及写笔记&#xff0c;主要是想睡觉哈&#xff0c;所以今天补上&#xff0c;我发现效率还挺高的&#xff0c;今天重新做笔记&#xff0c;加固了昨天的知识点&#xff0c;要不以后都这样子哈&#xff0c;学完第二天再写哈&#xff0c;要…

【MSPM0G3507】CCS-Sysconfig配置 按键控制LED(二)

1.相关配置 主控&#xff1a;MSPM0G3507编译环境&#xff1a;CCS 2.板子以及原理图 3.Sysconfig配置 LED配置一样 按键为INPUT DL_GPIO_readPins(GPIO_SWITCHES_PORT, GPIO_SWITCHES_USER_1_PIN)// 读取端口状态类型为uint32_t &#xff0c;返回的是对应引脚的状态位。比如…

react中组件间的通信

一、父传子 1.代码展示 import React, { useState } from react;function SonPage(props){ // 子组件const {msg} propsreturn (<div>我是子组件 {msg}</div>) }function App() { // 父组件const [msgText,setMsgText] useState(父传子)return (<div classN…

四、GD32 MCU 常见外设介绍 (5) TIMER 模块介绍

5.1.TIMER 基础知识 TIMER分高级定时器&#xff0c;通用定时器L0&#xff0c;L1&#xff0c;L2和基本定时器。 5.2.硬件连接说明 TIMER 属于片内外设&#xff0c;对于外部硬件设计&#xff0c;只需要单独IO口外接信号线即可。 5.3.GD32 TIMER 外设原理简介&#xff08;以 G…