一、需求

使用element-ui 的 table组件实现自定义列 + 固定列功能
这里只有解决方案,没有追根溯源,为啥嘞? 因为我菜 T.T

二、解决方案

直接上才艺
动态切换表格时,(随机性的)导致固定列塌陷(固定列的内容会坠下来),使用doLayout() 方法解决,具体如下:
vueupdated 中调用即可,也有在mountedbeforeUpdate中调用的,自行尝试。

updated() {
    this.$refs.table.doLayout()
  }

②解决了上述问题后 可能还会遇到这个问题:动态切换表头时,table发生闪烁问题
这边时直接设置 table.cell样式的高度给一个固定值,具体如下

//重写表格样式,不在自动计算,解决表格渲染时闪烁问题
//不写这个使用v-if重新渲染表格的时候会再次计算下宽高,导致了抖动div高度=table容器高度/行数
// -----取自某位老哥的分析
.el-table .cell {
    height: 25px!important;
  }

③表格自适应高度,我这边简单的提供一个思路的,因为我觉得我的实现不是最优解
我们通过实践发现,当table组件有height 或者 max-height的时候才会出现纵向滚动条,但是我们实际的业务需求和开发中,表格的高度往往需要自适应高度,如果手动为table body加滚动,就会出现固定列不随表格内容滚动情况,
解决方案如下: 动态设置table组件的height的属性值

:height="maxHeight"

this.maxHeight = this.$refs.table.$el.getBoundingClientRect().height

具体的api呀 方法啥的 都可以自己找的 不一定非要我这个写法,主要是思路:动态的赋予height的值就ok了

三、反思总结

大致看了一下element table的源码,导致上述问题的原因概率为table的组件的宽高大部分都是通过计算得来的,当我们动态的去切换时,就有可能到时某个计算过程出错或者不能有效的触发,进而导致渲染问题,好在element对外暴露了doLayout()方法,应该是设计阶段考虑到了这个问题呢

四、送给自己

咋搞哒?
为啥碰到这种难点的问题就急得抱头鼠窜呢?没事干的时候还是要长看看他们这些组件库的实现方式,我觉得不用逐字逐句的看,主要是看看思路,看看写法,分析分析设计等,这样当遇到自己解决不了的问题时,就可以“高谈阔论”的甩锅给组件库 T.T
哈哈,有问题的评论区聊