歡迎您光臨本站 註冊首頁

Vue 自適應高度表格的實現方法

←手機掃碼閱讀     e36605 @ 2020-06-03 , reply:0

前言  

示例版本為 Element-ui 2.13.1 + Vue 2.6.11

本人是做後臺開發的,由於公司業務要求需要將前後臺模塊進行分離,兩年前選擇使用 vue-element-admin 項目進行前臺的開發,該框架集成了很多功能,特別適合對 Vue 很陌生的新手,公司項目組成員接受程度普遍較高。

在使用過程中 表格 是必不可少的一個控件,用於展示數據,單頁數據量過多就會導致瀏覽器自動生成右側滾動條。

如果頁面有頭部信息或查詢按鈕,移動滾動條後會遮擋住這些操作和信息內容。

Element-UI 中的 el-table 提供了設置高度的選項,在代碼中設置 height 屬性就可以現在表格的高度,數據量過多也只會在表格內部生成滾動條,而不是整個頁面生成滾動條。



但是這個高度需要固定的數值,不同的分辨率或者縮放後的瀏覽器使用固定高度後,不能滿足只在 el-table 內部生成滾動條的條件。

想要滿足上述條件就需要使用 v-adaptive 指令了。

Vue 自定義指令  

你可能會好奇 v-adaptive 是在哪裡來的?它是自定義的指令,設置表格高度需要對普通 DOM 元素進行底層操作。Vue 除了核心功能默認內置的指令 ( v-model v-show ),也允許註冊自定義指令,相關 Api 可以查看 官方文檔 。

v-adaptive  

新建包名 src/directive/el-table ,創建 adaptive.js 。頁面縮放的監聽是使用的 element-ui 中的 resize-event ,將 addResizeListener removeResizeListener 引入進來。自定義指令要用到的鉤子函數:

  • bind:只調用一次,指令第一次綁定到元素時調用。在這裡可以進行一次性的初始化設置。

  • inserted:被綁定元素插入父節點時調用 (僅保證父節點存在,但不一定已被插入文檔中)。

  • unbind:只調用一次,指令與元素解綁時調用。

 import { addResizeListener, removeResizeListener } from 'element-ui/src/utils/resize-event' // 設置表格高度 const doResize = async(el, binding, vnode) => { // 獲取表格Dom對象 const { componentInstance: $table } = await vnode // 獲取調用傳遞過來的數據 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 // 計算列表高度並設置 const height = window.innerHeight - el.getBoundingClientRect().top - bottomOffset $table.layout.setHeight(height) $table.doLayout() } export default {  // 初始化設置 bind(el, binding, vnode) {  // 設置resize監聽方法 el.resizeListener = async() => {  await doResize(el, binding, vnode) }    // 綁定監聽方法到addResizeListener addResizeListener(window.document.body, el.resizeListener)  },  // 綁定默認高度 async inserted(el, binding, vnode) {  await doResize(el, binding, vnode)  },  // 銷燬時設置 unbind(el) {  // 移除resize監聽 removeResizeListener(el, el.resizeListener)  } }


接下來,需要將寫好的邏輯綁定到 Vue 中,在同一目錄下新建 index.js

 import adaptive from './adaptive' const install = function(Vue) {  // 綁定v-adaptive指令 Vue.directive('adaptive', adaptive) } if (window.Vue) { window['adaptive'] = adaptive  // eslint-disable-next-line no-undef  Vue.use(install) } adaptive.install = install export default adaptive


在單頁面使用  

指令相關代碼已經寫好了,接下來就是該如何使用了。找到想要設置表格自適應高度的 vue 文件,在 script 標籤下引入自定義的指令並綁定。

 import adaptive from '@/directive/el-table' export default { name:'Test', directives: { adaptive }, ... ... }


然後找到表格所在的標籤添加指令相關的代碼:

 ... ...


全局使用  

如果存在多個頁面需要設置自適應高度,為了減少使用指令的複雜度,我們可以在 main.js 中全局引入自定義的指令,上述 script 的內容就不需要在每個頁面進行寫入了。

 import adaptive from './directive/el-table' Vue.use(adaptive)


結尾  

源碼放在 GitHub 上了,希望可以幫助到你。


[e36605 ] Vue 自適應高度表格的實現方法已經有416次圍觀

http://coctec.com/docs/vue-js/show-post-236744.html