在Vue中使用ElementUI的el-table
标签会遇到以下问题
一、遇到页面切换时,表格内容错乱(对不齐):doLayout()
二、动态计算表格高度:getTableMaxHeight()
页面结构:搜索框+表格,通常会在表格内部进行滚动比较好看,这时候就需要计算并设置表格高度
xml
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true">
<el-form-item label="名字" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入名字"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
</el-form>
<el-table
ref="tables"
v-loading="loading"
:data="list"
:height="maxHeight"
>
<el-table-column label="ID" align="center" prop="id" />
<el-table-column label="名字" align="center" prop="name" />
<el-table-column label="年龄" align="center" prop="age" />
</el-table>
</div>
</template>
<script>
export default {
data() {
return {
loading: true,
list: [], // 表格数据
maxHeight: null,
queryParams: {}
},
created() {
this.getList();
},
mounted() {
// 监听窗口变化事件
window.addEventListener("resize", this.resizeScreen);
},
// 页面销毁时移除监听事件
beforeDestroy() {
window.removeEventListener('resize', this.resizeScreen)
},
// 页面缓存重新进入页面时,在路由组件被激活时触发
activated() {
this.$nextTick(() => {
this.$refs.tables.doLayout(); // 对表格重新布局(解决切换页面后列错乱)
})
},
methods: {
// 获取数据,设置表格高度
getList() {
this.loading = true;
this.list = [
{id: 1, name: '小红', age: 20},
{id: 2, name: '小华', age: 20},
{id: 3, name: '小东', age: 20},
{id: 4, name: '小刘', age: 20},
];
this.resizeScreen(); // 获取数据后,计算高度并重新渲染表格
this.loading = false;
},
// 窗口变化时,表格高度跟着动态变化
resizeScreen() {
this.$nextTick(() => {
this.maxHeight = this.getTableMaxHeight(); // 计算高度
this.$refs.tables.doLayout(); // 重新渲染表格
})
},
// 动态计算并返回:表格最大高度 computeHeight
getTableMaxHeight() {
if (!this.list.length) return // 如果没有数据,直接退出
if (!this.$refs.tables) return;
// 表头高度
var headerHeight = document.getElementsByClassName('el-table__header')[0].offsetHeight;
// 表内高度
var bodyHeight = document.getElementsByClassName('el-table__body')[0].offsetHeight;
// 默认表格高度 = 表头 + 表内 (表格渲染后的默认高度)
var tableDataHeight = headerHeight + bodyHeight;
// 页面高度
var pageHeight = document.getElementsByClassName('app-main')[0].offsetHeight;
// 页内边距
const pagePadding = 40;
// 动态高度:el-form 搜索框
var elFormHeight = document.getElementsByClassName('el-form')[0].offsetHeight;
// 导出行高度(包含margin)
const elRowOperButton = 36;
// 分页高度(包含margin)
const pagingHeight = 50;
// 计算页面最大容纳高度
var computeHeight = pageHeight - pagePadding - elFormHeight - elRowOperButton - pagingHeight;
// 是否有X轴滚动条
var hasScrollX = document.getElementsByClassName('el-table--scrollable-x').length;
// 当 最大高度 大于 表格数据高度时,取表格高度(注:有滚动条时 + 滚动条高度)
if (computeHeight > tableDataHeight) {
computeHeight = (hasScrollX ? tableDataHeight + 17 : tableDataHeight) + 1; // 必须+1,否在有y轴滚动条出现
}
// console.log('表头', headerHeight,
// 'rowHeights', rowHeights,
// 'pageHeight', pageHeight,
// 'lastHeight', computeHeight,
// 'tableDataHeight', tableDataHeight,
// 'computeHeight', computeHeight,
// )
return computeHeight;
}
}
}
</script>