el-table 展开行表格,展开的内容高度可以变化时,导致的固定列错位的问题

问题描述

一个可展开的表格(列设置了type="expand"),并且展开后的内容高度可以变化,会导致后面所有行的固定列错位,图如下,展示行中是一个树形表格,默认不展示子级,点击树形表格的展开展示子级后,外层表格展开后的内容高度发生变化,固定列发生错位

问题分析

网上提供了三种解决方案,

1、使用table.doLayout() ------ 不生效

2、结合使用列的width ------ 还是没有生效

操作一列中,fixed="right",需要指定宽度 width

与操作列相邻的一列不加width,其他的列指定宽度

3、使用:key="timeStap",更新表格 ------ 没有效果

4、使用this.$forceUpdate(),强制刷新 ------ 没有效果

5、table加上class="table-fixed",使用样式进行覆盖 ------ 没有效果

当展开内容中的树形表格,默认展开子级后,固定列没有错位,但是当收起子级后,固定列还是错位;

根本问题

表格展开列的高度发生变化后,固定列的对应的行的高度并没有动态变化,导致的错位;当我们在控制台手动修改对应行的高度时,会发现,可以达到目标效果

解决方案

每次当展开表格的内容高度发生变化时,触发重新计算固定列对应行高度的重新计算,直接操作对应行的dom来解决当前问题;

需要知道是哪一行($index)的内容高度发生了变化,当前表格的ref,展开行内容元素的className

js 复制代码
expandTableContentHeightChange(index) { //todo 展开表格的内容高度发生变化时
  this.$nextTick(() => {
    const goodsTableForm:any = this.$refs.goodsTableForm;
    resetFixedExpandedRowHeight(index, goodsTableForm, 'contract_line_expand')
  })
}

/**
 * * 重置固定列中展开行的高度
 * @param index 需要更新的当前行索引
 * @param currentTable 当前表格的ref
 * @param contentBoxClassName 展开行的内容类名
 */
export const resetFixedExpandedRowHeight = (index, currentTable, contentBoxClassName) => {
	const element = currentTable.$el;
	element.querySelector('.el-table__fixed')
	const fixedTableAllTrList = element.querySelectorAll('.el-table__fixed-body-wrapper .el-table__body tbody > .el-table__row');
	const originTableAllTrList = element.querySelectorAll('.el-table__body-wrapper .el-table__body tbody > .el-table__row');
	const fixedTableTrList = [...fixedTableAllTrList].filter(originTr => {
		return originTr.className.indexOf('el-table__row--level') === -1
	});
	const originTableTrList = [...originTableAllTrList].filter(originTr => originTr.className.indexOf('el-table__row--level') === -1);
	if (originTableTrList.length && originTableTrList[index]) {
		const originContentDiv = originTableTrList[index].nextSibling.querySelector(`.${contentBoxClassName}`);
		const { height: originTableTrHeight } = originContentDiv.getBoundingClientRect();
		const fixedContentDiv = fixedTableTrList[index].nextSibling.querySelector(`.${contentBoxClassName}`);
		fixedContentDiv.style.height = `${originTableTrHeight}px`;
	}
}
相关推荐
Highcharts.js2 小时前
Highcharts 云端渲染的真相:交互式图表与服务器端生成的边界
前端·信息可视化·服务器渲染·highcharts·图表渲染
zhuyan1083 小时前
Linux 系统磁盘爆满导致无法启动修复指南
前端·chrome
编程牛马姐4 小时前
独立站SEO流量增长:提高Google排名的优化方法
前端·javascript·网络
NotFound4864 小时前
实战指南如何实现Java Web 拦截机制:Filter 与 Interceptor 深度分享
java·开发语言·前端
Dontla4 小时前
高基数(High Cardinality)问题介绍(Prometheus、高基数字段、低基数字段)
前端·数据库·prometheus
一 乐5 小时前
医院挂号|基于springboot + vue医院挂号管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·医院挂号管理系统
whuhewei7 小时前
为什么客户端不存在跨域问题
前端·安全
妮妮喔妮7 小时前
supabase的webhook报错
开发语言·前端·javascript
qq_12084093717 小时前
Three.js 大场景分块加载实战:从全量渲染到可视集调度
开发语言·javascript·数码相机
yivifu7 小时前
手搓HTML双行夹批效果
前端·html·html双行夹注