el-table表格抖动的相关探讨

本文分享了一种解决Vue中动态增减表头导致表格闪烁的方法。通过监听控制列变化的关键变量,并结合`v-if`指令,在数据加载和高度计算完成后显示表格,从而避免闪烁。这种方法避免了固定单元格高度导致的溢出问题,实现了平滑的表格渲染体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个问题主要是element重新渲染的时候重计算了高度所导致的(好像是size不是默认的才会出现的问题?),
在网上看其他伙伴解决动态增减表头导致的闪烁,似乎都是重写表格样式,直接固定cell高度,这样子:

.el-table .cell{
  height:20px!important;
}

但是问题随之出现了,当数据太多需要换行的时候出现了溢出遮挡。。。后面的数据看不见了,所以又给表格加上tooltip-effect属性,可是又感觉好丑T^T(太难了)

仔细想了半天,那能不能等数据加载完、高度计算完再显示表格呢?

啊哈!感觉可行,于是迅速想到我们万能的refs,但是监听$refs这个事情它费时费力也不友好,还不能直接监听它,经尝试,此方案pass。
最后我决定监听一波控制列变化的那个关键的变量,监听加v-if控制表格显示与否,把闪动过程隐藏起来,嗯。。。。。。

一波操作过后,发现真的OK!
赶紧和大家分享一下,先上代码(简单的一个示意,意思到位就行哈,直接copy不太行呢,因为大家控制列变化的方式各不相同,还是要具体问题具体分析~,这里姑且给出两种情况):

  1. 直接用list控制的v-for生成的表格:
<!-- HTML: -->
<!-- changing是关键哈,这里实现的主要原理就在于,
在列变化完成后,也就是列高度计算完才显示表格,
也就是在本来闪那一下的时候我们不让它显示 -->
<el-table
   v-if="changing"
   :data="tableData"
   size="small"
>
     <el-table-column
        v-for="item in showColumn"
        :key="item.prop"
        :prop="item.prop"
        :label="item.label"
      >
 		 </el-table-column>
</el-table>
//JS:
data() {
 return {
   //通过改变show属性改变展示列
   tableInfo: [
        { prop: 'name', label: '名称', show: true, disabled: true },
        { prop: 'type', label: '类别', show: true, disabled: false },
        { prop: 'size', label: '尺寸', show: true, disabled: false },
      ],
   //从后端获取具体数据
   tableData:[],
   changing: true,
  }
}
computed: {
  // 展示列
  showColumn() {
     return this.tableInfo.filter((item) => item.show);
  },
},
  
//重头戏来了,筒子们:
watch: {
  showColumn() {
    this.changing = false; // 列变化时,表格短暂地处于一个不显示状态
    this.$nextTick(() => { // 列变化完成,表格显示
      this.changing = true;
    });
  },
},
  1. 某一项的增减 ( 原理都是一样的哈 ):
<el-table
   v-if="changing"
   :data="tableData"
   size="small"
>
    <el-table-column prop="name" label="名称"></el-table-column>
    <el-table-column
       v-if="columnShow"
       prop="item"
       label="增减列"
     >
 		</el-table-column>
</el-table>
//JS:
data() {
 return {
   //从后端获取具体数据
   tableData:[],
   changing: true,
  }
}
//关键!关键!
watch: {
  columnShow() {
    this.changing = false; // 列变化时,表格短暂地处于一个不显示状态
    this.$nextTick(() => { // 列变化完成,表格显示
      this.changing = true;
    });
  },
},

个人尝试暂时没有什么bug,欢迎小伙伴们一起研究探讨~,如发现问题,欢迎提出指正,感谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值