【Vue3】如何实现一个自适应表格高度的 Vue Hooks

使用场景:

当在 Vue 中使用表格组件时,希望表格高度能够自适应其内容,并且当表格容器的高度发生变化时能够及时更新表格高度。

实现方法:

1.

在函数中,创建了一个 height 变量,使用了 Vue 的 ref 函数来创建一个响应式的变量,初始值为 defaultHeight(默认为 400)。

2.

setTableHeight 函数使用了 debounce 函数,以在表格高度变化时进行防抖处理。防抖函数会在连续触发事件后的一段时间内只执行一次回调函数。回调函数中,通过获取表格元素的高度(offsetHeight),计算出表格内容的实际高度,并将其保存在 height 变量中。listenHeight 函数用于监听表格高度的变化。

3.

使用 elementResizeDetectorMaker 函数创建了一个用于监听元素大小变化的实例(erd)。然后,通过 document.getElementById 获取到指定 id 的表格元素(el)。最后,使用 erd.listenTo 方法监听表格元素的大小变化,并在变化时调用 setTableHeight 函数。在组件挂载后(onMounted),调用 listenHeight 函数开始监听表格高度变化。

4.

最后,将 height 变量作为响应式的返回值,将hook命名为useAdjustTable.js放入hooks文件夹以便在组件中使用。 代码:

js 复制代码
import elementResizeDetectorMaker from 'element-resize-detector'
import debounce from 'lodash/debounce'
import { ref, onMounted } from 'vue'
/**
 * table组件自适应hooks,用于table高度自适应
 * @param {String} id 表格ID
 */
export default function (id, defaultHeight = 400) {
  const height = ref(defaultHeight)

  const setTableHeight = debounce(
    element => {
      const eleHeight = element?.offsetHeight
      // 获取表格container高度
      const tableHeight = eleHeight
      // 40:表格头高度
      const headerHeight = 40
      height.value = tableHeight - headerHeight
    },
    30,
    {
      trailing: true
    }
  )

  const listenHeight = () => {
    const erd = elementResizeDetectorMaker()
    const el = document.getElementById(id)
    erd.listenTo(el, setTableHeight)
  }

  onMounted(listenHeight)

  return {
    height
  }
}

使用示例:

js 复制代码
   <a-table
      :id="tableId"
      class="drawer-table"
      :columns="COLUMNS"
      :data-source="attributeList"
      :pagination="false"
      :row-selection="rowSelection"
      :row-key="record => record.enName"
      :scroll="{ y: height }"
    >
    ...
    import useAdjustTable from '@/hooks/useAdjustTable'
    const { height } = useAdjustTable(tableId)
相关推荐
Cutecat_42 分钟前
视频字幕处理工具横向:提取模式 vs 编辑模式,该如何选择
android·前端·ios·语音识别
dsyyyyy11011 小时前
JavaScript变量
开发语言·javascript·ecmascript
qq_422152571 小时前
PDF 加水印工具怎么选?2026 年文档版权保护方案对比
前端·pdf·github
kyriewen1 小时前
手写 Promise.all、race、any:不到 30 行代码,解决并发异步的所有姿势
前端·javascript·面试
brucelee1862 小时前
OpenClaw 浏览器控制(Chrome MCP)完整教程
前端·chrome
ct9782 小时前
React 状态管理方案深度对比
开发语言·前端·react
胡志辉的博客3 小时前
深入浅出理解浏览器事件循环:从一道输出题讲到 Chrome 源码
前端·javascript·chrome·chromium·event loop
代码不加糖3 小时前
js中不会冒泡的事件有哪些?
前端·javascript·vue.js
懂懂tty3 小时前
Vue2与Vue3之间API差异
前端·javascript·vue.js
AI焦点3 小时前
跨越协议鸿沟:Tool Use状态机从Anthropic到OpenAI兼容体系的适配要点
前端·人工智能