1. 程式人生 > 程式設計 >Vue 自適應高度表格的實現方法

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

前言

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

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

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

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

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

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

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

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

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

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

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

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

Vue 自定義指令

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

v-adaptive

新建包名 src/directive/el-table ,建立 adaptive.js 。頁面縮放的監聽是使用的 element-ui

中的 resize-event ,將 addResizeListenerremoveResizeListener 引入進來。自定義指令要用到的鉤子函式:

  • 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,vnode) {
    // 設定resize監聽方法
    el.resizeListener = async() => {
      await doResize(el,vnode)
    } 
    // 繫結監聽方法到addResizeListener
    addResizeListener(window.document.body,el.resizeListener) 
  },// 繫結預設高度
  async inserted(el,vnode) {
    await doResize(el,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 },
  ... ...
}

然後找到表格所在的標籤新增指令相關的程式碼:

<el-table 
  ref="table"
  // 自定義指令,bottomOffset 代表距離底部的距離
  v-adaptive="{bottomOffset: 85}"
  // 高度屬性,100無具體意義,僅為初始值,不可省略
  height="100px"
 >
 ... ...
 </table>

全域性使用

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

import adaptive from './directive/el-table'

Vue.use(adaptive)

結尾

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

到此這篇關於Vue 自適應高度表格的實現方法的文章就介紹到這了,更多相關Vue 自適應高度表格內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!