在Vue中使用ElementUI的el-table
标签会遇到以下问题
一、遇到页面切换时,表格内容错乱(对不齐):doLayout()
二、动态计算表格高度:getTableMaxHeight()
页面结构:搜索框+表格,通常会在表格内部进行滚动比较好看,这时候就需要计算并设置表格高度
<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>
复制