【Vue】如何写一个表格列显隐控制的组件?

Element-ui表格动态列显隐,数据错位?一个key属性轻松搞定(附Vue复用原理) 本文深入解析了Element-ui表格动态列显隐时出现数据错位的问题,揭示了Vue虚拟DOM渲染机制的核心原理。通过引入key属性,有效解决了列复用导致的显示异常,并提供了Vue 2/3中的最佳实践方案,帮助开发者优化表格性能与用户体验。 阅读详情

需求

公司项目需要实现对表格列的显示隐藏进行配置,额外配置可自行添加,感觉这个组件挺泛用的,随便记录下。

这里只是说简单的显隐控制,复杂的只是在页面里面多写而已,核心代码是一样的。

简单的:

image

比较复杂的:

image

代码实现

表格页面.vue

<column-setup
@columnSetup="columnSetup"
:baseSelectedColumns="selectedColumns"
page="report"
></column-setup>
					
<el-table-column
prop="name"
label="Name"
width="auto"
v-if="isShowClumn('Name')"
show-overflow-tooltip
></el-table-column>
selectedColumns: [
        {
          displayName: 'Name',
          show: true,
        },
        {
          displayName: 'Email Address',
          show: true,
        },
        {
          displayName: 'Profile Type',
          show: true,
        },
        {
          displayName: 'User Type',
          show: true,
        },
      ],
columnSetup(selectedColumns) {
      this.selectedColumns = selectedColumns
    },
    isShowClumn(name) {
      let isShow
      this.selectedColumns.forEach((item) => {
        if (item.displayName === name) {
          isShow = item.show
        }
      })
      return isShow
    },

组件.vue

样式请自行删减,有些是无用代码。

点击查看代码
<template>
  <div class="table-custom-display">
    <el-tooltip effect="dark" content="Columns" placement="top">
      <el-popover
        placement="bottom"
        title=""
        trigger="click"
        v-model="visible"
        popper-class="columns-popover"
        @hide="close()"
        @show="show"
      >
        <h2>Columns</h2>
        <div class="top-check">
          <el-input
            placeholder="Search"
            prefix-icon="el-icon-search"
            v-model.trim="selectParam"
            clearable
            size="mini"
            @input="search"
          ></el-input>
          <div class="bot-check">
            <template v-for="(item, index) in selectedColumns">
              <div :key="item.name">
                <el-checkbox
                  v-model="item.show"
                  :key="item.name"
                  checked
                  v-show="isShowItem(item, index)"
                >
                  <div class="switch-defaults-name">
                    {{ item.displayName }}
                  </div>
                </el-checkbox>
              </div>
            </template>
          </div>
        </div>
        <div style="text-align: right; margin: 0" class="footer">
          <el-button type="primary" size="mini" @click="done">
            Done
          </el-button>
          <el-button size="mini" type="text" @click="visible = false">
            Cancel
          </el-button>
        </div>
        <el-button
          type=""
          size="medium"
          icon="el-icon-setting"
          style="font-size: 14px; margin-left: 10px; margin-top: 15px;"
          slot="reference"
        ></el-button>
      </el-popover>
    </el-tooltip>
  </div>
</template>

<script>
export default {
  name: '',
  props: {
    baseSelectedColumns: {
      type: Array,
      default: () => {
        return []
      },
    },
  },
  data() {
    return {
      buttons: sessionStorage.getItem('buttonPermissions'),
      visible: false,
      selectParam: '',
      matchIndexArr: [],
      initSelectedColumns:[],
      selectedColumns: [],
    }
  },
  watch: {
    baseSelectedColumns: {
      deep: true, // 深度监听
      handler(newVal, oldVal) {
        this.selectedColumns = JSON.parse(JSON.stringify(newVal))
      },
    },
  },
  mounted(){
    this.selectedColumns = JSON.parse(JSON.stringify(this.baseSelectedColumns))
  },
  methods: {
    close() {
      this.visible = false
    },
    show(){
      this.selectedColumns = JSON.parse(JSON.stringify(this.baseSelectedColumns))
    },
    done() {
      let content = JSON.parse(JSON.stringify(this.selectedColumns))
      this.visible = false
      this.$emit('columnSetup', content)
    },
    search() {
      this.matchIndexArr = []
      this.selectedColumns.forEach((item, index) => {
        let str = item.displayName.toLowerCase()
        if (str.match(this.selectParam) !== null) {
          this.matchIndexArr.push(index)
        }
      })
    },
    isShowItem(item, index) {
      if (this.selectParam) {
        return this.matchIndexArr.indexOf(index) !== -1
      } else {
        return true
      }
    },
  },
}
</script>

<style scoped lang="scss">
::v-deep .el-checkbox__input.is-checked + .el-checkbox__label {
  color: #596571 !important;
}

::v-deep .el-checkbox {
  display: flex;
  margin-right: 0;
}

::v-deep .el-checkbox__input,
.is-checked {
  display: flex;
  align-items: center;
}

::v-deep .el-checkbox__label {
  /* background-color: red; */
  width: 98%;
  height: 30px;
}

::v-deep .el-switch.is-checked .el-switch__core {
  border-color: #47bfaf !important;
  background-color: #47bfaf !important;
}

.top-check {
  // display: flex;
  // align-content: center;
  // justify-content: space-between;

  .reset {
    cursor: pointer;
    font-size: 14px;
  }

  /deep/.el-tabs__item {
    height: 28px;
    line-height: 28px;
    font-size: 18px;
    padding: 0 20px !important;
    color: #828282;
  }

  /deep/ .el-tabs__item:hover {
    color: #828282 !important;
  }

  /deep/ .el-tabs__item.is-active {
    color: #47bfaf !important;
  }

  /deep/ .el-input__inner {
    border: 1px solid #1e384b !important;
    color: #1e384b !important;
    border-radius: 5px;
    font-weight: 500;
    height: 35px;
  }

  /deep/ .el-icon-circle-close {
    color: #828282 !important;
    margin-left: -20px;
    line-height: 28px;
  }
}

.bot-check {
  margin-top: 10px;
  height: 170px;
  overflow-y: auto;

  /deep/.el-checkbox__label {
    padding: 5px 10px;
  }

  /deep/.el-link--inner {
    padding: 10px 0;
  }

  .check-box {
    display: flex;
    flex-direction: column;
  }

  .system-check-box {
    display: flex;
    justify-content: space-between;
  }

  .switch-defaults-name {
    max-width: 223px;
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
  }

  .switch-system-name {
    max-width: 183px;
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
  }

  .label-wrapper {
    margin: 14px 0;
    display: flex;

    &:nth-child(2) {
      margin-top: 0;
    }

    .label-item {
      display: flex;
      align-items: center;
    }

    .label-text {
      margin-left: 10px;
    }

    .label-switch {
      flex-grow: 1;
      justify-content: right;
    }
  }
}

.footer {
  /deep/ .el-button--primary {
    border-radius: 5px !important;
    background-color: #47bfaf;
    border-color: #47bfaf;
  }
}

.table-custom-display {
}
</style>
<style>
.columns-popover {
  background-color: #fff;
  width: 300px;
}

.icon-popover {
  background: #fff;
}

.columns-tootip {
  z-index: 200000000000020 !important;
}

.switch-tootip .popper__arrow {
  left: 40px !important;
}
</style>
Vue3 + Element-Plus 动态表格避坑指南:三步根治 v-if 列显隐导致的数据错乱 通过上述方案,可彻底解决列显隐时的数据错位问题。实际项目中还建议通过。验证不同药品类型切换时的列渲染状态,确保关键业务字段的显示一致性。在你的具体案例中,需要为以下列补充。在动态切换列显隐后,调用表格的。+ CSS 方案(需注意。若存在高频切换场景,可将。 阅读详情

相关推荐

Ruoyi框架实战:如何动态控制表格列的显示与隐藏(附完整代码示例)

本文详细介绍了在Ruoyi框架中实现动态控制表格列显示与隐藏的三种方案,从基础配置到工程化实现,涵盖列管理组件、状态持久化及性能优化等关键点。通过完整代码示例,帮助开发者掌握Element UI表格的动态列控制技术,提升后台管理系统的用户体验。

j2k3l4的博客 941

【vue3组件封装】Table和TableColumn表格

vue3表格封装

aaaaapipi的博客 3495

Conda虚拟环境用conda和pip安装软件包的路径问题

解决在虚拟环境中用pip默认把软件包安装到全局site-packages中。

stone9528的博客 4万+

vue element ui table表格--实现列的显示与隐藏

vue element ui table表格 -- 实现列的显示与隐藏

王二的博客 7899

ArcGIS属性表汉字转拼音

接着我安装了一个编辑器“PyCharm Community Edition 2019.3.3\bin\pycharm64.exe”,在里面添加“pypinyin”包,然后将其设置为arcgis的编辑器和调试程序,还是失败;我在10.6的机器上折腾了上面几步,直到两周后脚本突然运行成功,我也不确定是哪一步导致pypinyin包配置成功,因此将心得体会写出来,如果过一段时间,打开10.2的机器运行脚本成功了,再写后续.......,按照“配置方法1:”进行尝试,显示配置失败。

2301_77413856的博客 1295

表格数据学习的图神经网络综述

今天学习一篇发表在中科院一区期刊《ACM Computing Surveys》的综述文章《Graph Neural Networks for Tabular Data Learning: A Survey with Taxonomy & Directions》,该刊主要刊载计算机理论方法领域的系统性综述与教程论文,注重跨学科技术融合研究,最新的影响因子为28.0。本文的目的在于通过学习这篇文章,了解关于表格数据学习点图神经网络一些基础知识。

qq_41009600的博客 801

a-popover的使用

a-popover的使用 <template> <div id="popoverUsing"> <a-popover autoAdjustOverflow overlayClassName="myPopClass" v-model="visible" trigger="click" placement="bottomLeft" @visibleChange="afterCloseDo"

weixin_小白鼠的博客 6329

再见 n8n?Google Opal 实测:一句话生成 APP,这才是 AI 的正确打开方式!

Google Opal深度评测:这款自然语言生成工作流的AI工具,通过三个实战案例(科技早报生成器、冰箱食谱助手、爆款文案转译机)展示了其零代码开发的强大能力。它凭借Gemini 3.0 Pro和Google生态的无缝集成,将自动化门槛降至新低,预示着一个“意图驱动开发”的新时代。

莫潇羽的个人博客 848

【vue+表格组件】处理匿名: 表格显示字段控制显示

list: header:[ { prop: "userId", label: "评价人昵称", isAnonymousFlag:"isAnonymous", isAnonymous:"0" },{ prop: "isAnonymous", label: "是否匿名", stateType: "evaluation", stateMap: "isAnonymous", } ],

栀妹儿的炼丹炉 392

MPU6050的四元数解算姿态方法

使用MPU6050硬件DMP解算姿态是非常简单的,下面介绍由三轴陀螺仪和加速度计的值来使用四元数软件解算姿态的方法。 我们先来看看如何用欧拉角描述一次平面旋转(坐标变换): MPU6050的四元数解算姿态方法 设坐标系绕旋转α角后得到坐标系,在空间中有一个矢量在坐标系中的投影为,在内的投影为由于旋转绕进行,所以Z坐标未变,即有。 转换成矩阵形式表示为: 即 所以从旋转到可以写成上面仅仅是绕一根轴的旋转,如果三维空间中的欧拉角旋转要转三次: MPU6050的四元数解算姿态方法 上面得到了一个表示旋转的方

qq_41938005的博客 8393

openclaw通俗入门系列4——智能体工作区

工作区 = 智能体的家,存放它的性格、记忆、技能。默认不是牢笼(可以用沙箱隔离)。建议放到私有 Git 备份,但绝对不要提交密钥!

m0_60605453的博客 463

【Vue3】表格动态显示、隐藏列字段

本文介绍了如何使用 Naive-UI 的数据表格组件实现表格列的动态显示与隐藏功能。通过设置筛选弹窗控制表格列的显示状态,包含以下关键点:1) 使用复选框控制列字段的显示/隐藏;2) 实现特定列的禁用功能(如固定列);3) 动态计算表格宽度适配不同列数;4) 通过深拷贝保持原始列配置。该方案提供了灵活的表列管理方式,适用于需要自定义显示字段的场景,代码结构清晰,易于扩展和维护。

leader_li的博客 930

基于Mask-RCNN网络的书架图书书脊分割和检测(含代码)

图书馆的书架上的图书书脊分割/检测对于图书书名等信息的识别具有重要意义,因此,该博客基于Mask-RCNN网络实现了图书书脊的分割和检测,有利于进一步利用ocr文字识别技术实现图书书名等信息的入库。如下图所示,为书架原始数据和分割/检测后的结果。(本文已训练模型,无需训练)

qq_44619530的博客 2026

基于element-ui的 动态列分页表格(动态控制表格列的显隐)

文章目录组件代码使用案例系列文章 此案例基于 基于element-ui的分页表格组件,增加了动态列的功能。墙裂建议按顺序食用。 实现思路: 实现动态列本质上是控制列的显隐状态,如果是使用jQuery的话,无非是操作dom。目前使用的是vue,其屏蔽了dom的操作,允许我们通过变量间接的操作dom。之前实现过一个版本,形式类似这位仁兄写的博文(此链接),而且我是封装成了组件,父子级组件的数据、属性设...

Markix的博客 4181

STC单片机 普通 I/O 口中断功能介绍和使用

STC32单片机 普通 I/O 口中断功能介绍和使用

perseverance51博客 3048

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Element-UI表格列动态显隐:基于右键菜单与localStorage的完整实现方案

本文详细介绍了Element-UI表格组件实现列动态显隐的完整方案。通过右键菜单与localStorage的联动,用户可自定义列显示,提升后台管理系统的交互体验。方案核心在于数据驱动视图与状态持久化,并解决了表格样式抖动等常见问题,提供了稳定可靠的实现路径。

ol789012345的博客 848

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

vue——动态控制表格列的显示和隐藏

如图,为要实现的需求,即右键table的表头弹出菜单栏,通过勾选多选框的内容来控制表格列的显示和隐藏。 1. HTML部分(elemen-ui): <el-table :data="list" border fit @header-contextmenu="contextmenu"> <el-table-column v-if="colData[0].istrue" l...

景严-的博客 3万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

element table表格组件的控制列、按钮的显隐,以及列的乱序问题

element table表格组件的控制列、按钮的显隐,以及列的乱序问题 1.关于控制table的按钮的显隐 element的table的按钮的显隐应该使用 v-show 不可以使用v-if,因为v-if会导致按钮显示不全的问题 2.关于控制table的列的显隐问题 element的table的列的显隐必须使用 v-if,使用v-show是没有效果的,当你的列很多时,可以使用div将列包裹起来...

华唐的博客 1236

【若依前后端分离】el-table表格添加动态筛选列--显隐列(重新登录记忆上次选择的显隐列)

el-table表格添加动态筛选列--显隐列(重新登录记忆上次选择的显隐列),是对若依自带显隐列组件的解读和延伸,既可以动态显隐列,也可以退出登录后记住上次所勾选的显隐列,下次登录时,在create生命周期时进行记忆渲染,亲测好用,分享给大家!

敲厉害的燕宝的博客 3530

vue组件之table表格

table表格组件预览地址 (展示官网会略卡,一开始容易加载不出来) 基于vue写一个table组件 目前暂时打算完成的功能 固定表头 固定列 固定排序,接受排序函数,请求后端排序 请求时期的动画 多选框 展开行 结构和api借鉴AntDesign的, <x-table :columns="columns1" :data="data"> </x-table...

weixin_34289454的博客 5万+

父组件和子组件的显隐控制

父组件和子组件的显隐控制第一步:封装组件第二步:父组件中引用子组件第三步: 编写子组件的内容第四步:效果第五:删除子组件中多余按钮 第一步:封装组件 建一个文件夹用来放置组件内容 第二步:父组件中引用子组件 这是子组件的name 三步引入 第三步: 编写子组件的内容 因为要在多处使用这个页面,所以才封装成为一个组件 第四步:效果 这是父组件 通过点击某一行进入子组件,效果是覆盖父组件的表格,展现出子组件的内容,通过v-if,以及,子传父的emit方法进行父子之间的传值 首先给父组件定义一个flag

qq_45018844的博客 2006

动态控制表格表头显隐,让表格变得更加智能

动态控制表格表头显隐,让表格变得更加智能

希望看完文章的你能够带着答案离开。 1131

Element-UI表格列动态显隐:从右键菜单到本地存储的完整实现

本文详细讲解了Element-UI表格组件实现列动态显示与隐藏的完整方案。通过监听表头右键菜单事件,结合Vue响应式数据管理列状态,并利用localStorage实现用户偏好的持久化存储,有效解决了后台管理系统因表格列过多导致的数据查看效率低下问题。

weixin_29001683的博客 464

element 控制表格列显隐

最近接了个新需求,需要用户自己筛选某一列显示与否 其实大致思路就是使用CheckBox绑定的值控制表格列绑定的v-if的值,通过vue的watch来监控CheckBox绑定值的变化来控制 下面看代码 //首先是引入element组件中的表格 <el-table :data="tableData" stripe border style="width: 98%" ref="tableDataRef"> <el-table-column type="selection" width=".

h_未来可期_的博客 1256

vue表格上的控件显隐的一些想法

在做表格组件中,常常需要进行编辑操作,即点击单元格出现数据框操作。 但是引发了我一个思考,当一个表格特别复杂的时候,数据量比较多的时候,就要更多的标识字段进行显隐控制,我们有这样几种方法处理。 处理: 对于表格中的数据进行一个格式化操作,前台获取到后台数据以后进行一个格式化操作,比如将名称字段格式化成 name:{show:fase,value: xxxx},这样增加了数据的深度,并且对于每个数据都要遍历和重组,次数为:行数x列数,况且每次进行编辑可能页面的数据要进行刷新,每次刷新又要进行重组。

记忆者的博客 283

Vue控制表格列的显示隐藏

table控制列显示隐藏的功能 当选中时 table列显示,未选中时隐藏该列 首先造轮子 全局拿来用 // 这是子组件 <template> <div style="text-align: right;"> <el-popover placement="right" title="列筛选" trigger="click" > <el-checkbox-group v-model="checkList" @change="filter"

withme 6926
上一篇: 【Element】el-option value 绑定对象类型(item)
下一篇: 【Vue】vue-pdf 库第三方签章不显示的解决方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值