前言
- 现在后端管理系统主页面基本都是由三部分组成
- 查询条件,高度不固定,可能有的页面查询条件多,有的少
- 表格,高度不固定,占据页面剩余高度
- 分页,高度固定
- 这三部分加起来肯定是占满全屏的,那么我们可以结合
flex
布局,来实现。
代码及效果
app.vue
<template><div id="app"><div class="routers"><router-link :to="item.path" v-for="item in routerLinks" :key="item.name">{{ item.name }}</router-link></div><div class="content"><router-view /></div></div>
</template>
<script>
export default {data() {return {routerLinks: [],};},created() {this.handleRouterLink();},methods: {handleRouterLink() {this.routerLinks = this.$router.getRoutes();},},
};
</script><style lang="scss" scoped>
#app {height: 100vh;display: flex;flex-direction: column;
}
.routers {display: flex;justify-content: space-around;
}
.content {flex: 1;
}
</style>
test.vue
<template><div class="wrapper"><div class="searchView"><div class="formItem" v-for="(item, index) in formNum" :key="index"></div></div><div class="tableView" :key="tableKey"><el-table :data="tableData" ref="myTable" style="width: 100%" :height="tableHeight"><el-table-column prop="date" label="日期" width="180"> </el-table-column><el-table-column prop="name" label="姓名" width="180"> </el-table-column><el-table-column prop="address" label="地址"> </el-table-column></el-table></div><div class="pageView"><el-pagination:pager-count="5"@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page.sync="currentPage2":page-sizes="[100, 200, 300, 400]":page-size="100"layout="sizes, prev, pager, next":total="1000"></el-pagination></div></div>
</template>
<script>
export default {data() {return {tableKey: 0,currentPage2: 1,formNum: 4,tableHeight: 500,tableData: [{date: '2016-05-02',name: '王小虎',address: '上海市普陀区金沙江路 1518 弄',},{date: '2016-05-04',name: '王小虎',address: '上海市普陀区金沙江路 1517 弄',},{date: '2016-05-01',name: '王小虎',address: '上海市普陀区金沙江路 1519 弄',},{date: '2016-05-03',name: '王小虎',address: '上海市普陀区金沙江路 1516 弄',},],};},async mounted() {this.handleTableHeight();window.onresize = this.getDebounce(this.handleTableHeight, 500);},methods: {async handleTableHeight() {this.tableHeight = 0;await this.$nextTick();const tableView = document.querySelector('.tableView');this.tableHeight = tableView.clientHeight;console.log('tableHeight', this.tableHeight);this.tableKey++;},handleSizeChange(val) {console.log(`每页 ${val} 条`);},handleCurrentChange(val) {console.log(`当前页: ${val}`);},getDebounce(func, delay) {let timer = null;return function (...args) {if (timer) {clearTimeout(timer);}timer = setTimeout(() => {func.apply(this, args);}, delay);};},},
};
</script>
<style lang="scss" scoped>
.wrapper {display: flex;flex-direction: column;height: 100%;.searchView {display: flex;flex-wrap: wrap;gap: 10px 20px;.formItem {width: 230px;height: 30px;border: 1px solid #000;}}.tableView {flex: 1;}
}
</style>
效果
思路
- 首先整个内容主页面
.wrapper
肯定是flex
,并且纵向布局,高度100%。 - 其次,我们要分别在
查询条件、表格、分页
外层套一层div
,这样好进行样式管理。 - 内容主页面肯定主要展示的是表格,那么我们就给表格外层的div
tableView
设置flex: 1;
,占据剩余所有高度 - 当页面加载完成的时候,由于是
flex
布局,表格的高度(剩余高度)就是wrapper的高度100% - searchView的高度 - pageView的高度
。 - 然后我们在
mounted
钩子函数中,获取.tableView
div的clientHeight
高度,这个值,就能作为表格的高度了。 - 最后我们把这个高度值赋值给表格
el-table的height
属性,并且刷新key
,强制表格重新渲染以达到效果。 - 最最后,我们给
window.onresize
绑定了事件,并且优化了使用防抖,当浏览器大小修改的时候,页面也会动态自适应高度。