這篇文章主要講解了Vue怎么實(shí)現(xiàn)自適應(yīng)高度表格,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
成都創(chuàng)新互聯(lián)公司專注于玄武企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城網(wǎng)站制作。玄武網(wǎng)站建設(shè)公司,為玄武等地區(qū)提供建站服務(wù)。全流程按需定制制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)前言
示例版本為 Element-ui 2.13.1 + Vue 2.6.11
本人是做后臺(tái)開發(fā)的,由于公司業(yè)務(wù)要求需要將前后臺(tái)模塊進(jìn)行分離,兩年前選擇使用vue-element-admin 項(xiàng)目進(jìn)行前臺(tái)的開發(fā),該框架集成了很多功能,特別適合對(duì) Vue 很陌生的新手,公司項(xiàng)目組成員接受程度普遍較高。
在使用過程中 表格 是必不可少的一個(gè)控件,用于展示數(shù)據(jù),單頁數(shù)據(jù)量過多就會(huì)導(dǎo)致瀏覽器自動(dòng)生成右側(cè)滾動(dòng)條。
如果頁面有頭部信息或查詢按鈕,移動(dòng)滾動(dòng)條后會(huì)遮擋住這些操作和信息內(nèi)容。
Element-UI 中的 el-table 提供了設(shè)置高度的選項(xiàng),在代碼中設(shè)置 height 屬性就可以現(xiàn)在表格的高度,數(shù)據(jù)量過多也只會(huì)在表格內(nèi)部生成滾動(dòng)條,而不是整個(gè)頁面生成滾動(dòng)條。
但是這個(gè)高度需要固定的數(shù)值,不同的分辨率或者縮放后的瀏覽器使用固定高度后,不能滿足只在 el-table 內(nèi)部生成滾動(dòng)條的條件。
想要滿足上述條件就需要使用 v-adaptive
指令了。
Vue 自定義指令
你可能會(huì)好奇 v-adaptive
是在哪里來的?它是自定義的指令,設(shè)置表格高度需要對(duì)普通 DOM 元素進(jìn)行底層操作。Vue 除了核心功能默認(rèn)內(nèi)置的指令 ( v-model
和 v-show
),也允許注冊(cè)自定義指令,相關(guān) Api 可以查看 官方文檔 。
v-adaptive
新建包名 src/directive/el-table
,創(chuàng)建 adaptive.js
。頁面縮放的監(jiān)聽是使用的 element-ui
中的 resize-event
,將 addResizeListener
和 removeResizeListener
引入進(jìn)來。自定義指令要用到的鉤子函數(shù):
import { addResizeListener, removeResizeListener } from 'element-ui/src/utils/resize-event' // 設(shè)置表格高度 const doResize = async(el, binding, vnode) => { // 獲取表格Dom對(duì)象 const { componentInstance: $table } = await vnode // 獲取調(diào)用傳遞過來的數(shù)據(jù) const { value } = binding if (!$table.height) { throw new Error(`el-$table must set the height. Such as height='100px'`) } // 獲取距底部距離(用于展示頁碼等信息) const bottomOffset = (value && value.bottomOffset) || 30 if (!$table) return // 計(jì)算列表高度并設(shè)置 const height = window.innerHeight - el.getBoundingClientRect().top - bottomOffset $table.layout.setHeight(height) $table.doLayout() } export default { // 初始化設(shè)置 bind(el, binding, vnode) { // 設(shè)置resize監(jiān)聽方法 el.resizeListener = async() => { await doResize(el, binding, vnode) } // 綁定監(jiān)聽方法到addResizeListener addResizeListener(window.document.body, el.resizeListener) }, // 綁定默認(rèn)高度 async inserted(el, binding, vnode) { await doResize(el, binding, vnode) }, // 銷毀時(shí)設(shè)置 unbind(el) { // 移除resize監(jiān)聽 removeResizeListener(el, el.resizeListener) } }