vue 基于element-ui 开发Layout 自动计算表格高度组件
<template>
<div :class="`layout_page${className ? ' ' + className : ''}`">
<header ref="header" class="layout_header">
<slot name="header"> </slot>
</header>
<main ref="table" class="layout_table">
<slot name="table" :tableHeight="tableHeight"> </slot>
</main>
<footer ref="footer" class="layout_footer">
<slot name="footer"> </slot>
</footer>
</div>
</template>
<script>
import { debounceNew } from '@/utils';
export default {
name: 'LayoutPage',
props: {
// 开启计算 动态列的情况需要等到数据加载完成调用
initIsCalculate: {
type: Boolean,
default: false,
},
className: {
type: String,
default: '',
},
// 是否是动态列
isDynameicColumn: {
type: Boolean,
default: false,
},
},
data() {
return {
tableHeight: 500,
};
},
mounted() {
// 不是动态列 直接开启计算
if (!this.isDynameicColumn) {
this.$nextTick(() => {
this.calculateTableHeight();
window.onresize = debounceNew(this.calculateTableHeight, 300);
});
}
},
watch: {
// 如果是动态列 等到数据加载完成后 计算
initIsCalculate(newVal) {
if (newVal && this.isDynameicColumn) {
this.calculateTableHeight();
window.onresize = () => {
debounceNew(this.calculateTableHeight, 100);
};
}
},
},
methods: {
calculateTableHeight() {
const navbarHeight = 84;
const headerHeight = this.$refs.header.offsetHeight;
const footerHeight = this.$refs.footer.offsetHeight;
const windowHeight = document.documentElement.offsetHeight;
const paginationHeight = document.querySelector('.el-pagination').offsetHeight;
const tableHeight =
windowHeight - navbarHeight - headerHeight - paginationHeight - footerHeight;
this.tableHeight = tableHeight;
// document.querySelector('.el-table').style.height = `${tableHeight}px`;
// const tableHeaderHeight = document.querySelector(
// '.el-table__header-wrapper'
// ).offsetHeight;
// document.querySelector('.el-table__body-wrapper').style.overflow = `auto`;
// document.querySelector('.el-table__body-wrapper').style.height = `${
// tableHeight - tableHeaderHeight
// }px`;
},
},
beforeDestroy() {
window.onresize = null;
},
};
</script>
<style lang="scss" scoped>
.layout_page {
.layout_header {
padding: 10px 10px 0;
}
}
</style>
调用:
<template>
<Layout
className="system_manage_detail"
:isDynameicColumn="true"
:initIsCalculate="initIsCalculate"
>
<template #header>
</template>
<template #table="{ tableHeight }">
<el-table
ref="table"
:height="tableHeight"
:data="tableData"
:row-class-name="tableRowClassName"
@selection-change="handleSelectionChange"
@row-click="handleRowClick"
@sort-change="handleSortChange"
>
</el-table>
</template>
</Layout>
</template>

浙公网安备 33010602011771号