不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:Albert.Wen  添加时间:2023-10-19 23:17:08  修改时间:2024-04-30 09:42:59  分类:前端/Vue/Node.js  编辑

开发中表格功能是很常见的功能,自适应高度也是比较头疼的问题。

实现方法一:指令

1、新建监听文件

  • 创建目录:src/directive/table
  • 新建文件:(1) adaptive.js   (2) index.js

(1) adaptive.js

import { addResizeListener, removeResizeListener } from 'element-ui/src/utils/resize-event'

 // 设置表格最小高度
 const tableMin = 200
 // 设置表格高度
 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

  // 计算列表高度并设置
  let height = window.innerHeight - el.getBoundingClientRect().top - bottomOffset
  // 设置最小高度
  height = height < tableMin ? tableMin : height
  $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)  
        addResizeListener(el, el.resizeListener)
    },  
    // 绑定默认高度
    async inserted(el, binding, vnode) { 
        await doResize(el, binding, vnode)  
    },
    // 组件发生变化时触发
    async componentUpdated(el, binding, vnode) {
      await doResize(el, binding, vnode)
    },
    // 销毁时设置
    unbind(el) { 
        // 移除resize监听
        removeResizeListener(el, el.resizeListener)  
    }
}

(2) 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

2、应用到组件

方式一:组件内引用

import adaptive from '@/directive/table/index.js'
...
directives: { adaptive },
...
<el-table
   ref="table"
   :data="tableData.data"
   // 高度属性,100无具体意义,仅为初始值,不可省略 
   height="100px"
   // 自定义指令,bottomOffset 代表距离底部的距离 
   v-adaptive="{bottomOffset: 84}"
  border>
...

方式二:全局引用

import adaptive from './directive/table';

Vue.use(adaptive)

 

参考文章:Vue 自适应高度表格

二、实现方法二:

监听resize方法实现

import { debounce } from '@/utils/index' 


<el-table
   ref="table"
  :data="tableData.data"
   :height="tableHeight"
   border
  >

let that = this
// debounce 是防抖方法
window.addEventListener('resize', debounce(() => {
  that.resizeEvent()
}, 100))

resizeEvent() {
  // 计算高度赋值就可以
  this.tableHeight = xxx
}

// 销毁页面时,移除监听方法
 beforeDestroy() {
    window.removeEventListener('resize', debounce())
}