前言
现在后端管理系统主页面基本都是由三部分组成 查询条件,高度不固定,可能有的页面查询条件多,有的少 表格,高度不固定,占据页面剩余高度 分页,高度固定 这三部分加起来肯定是占满全屏的,那么我们可以结合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
,这样好进行样式管理。 内容主页面肯定主要展示的是表格 ,那么我们就给表格外层的divtableView
设置flex: 1;
,占据剩余所有高度 当页面加载完成的时候,由于是flex
布局,表格的高度(剩余高度)就是wrapper的高度100% - searchView的高度 - pageView的高度
。 然后我们在mounted
钩子函数中,获取.tableView
div的clientHeight
高度,这个值,就能作为表格的高度了。 最后我们把这个高度值赋值给表格el-table的height
属性,并且刷新key
,强制表格重新渲染以达到效果。 最最后,我们给window.onresize
绑定了事件,并且优化了使用防抖 ,当浏览器大小修改的时候,页面也会动态自适应高度。