Vue + Element UI 表格自适应高度如何做?

文章目录

摘要

在实际开发中,我们经常会遇到这样的场景:页面上有一个表格(el-table),上方有筛选条件或按钮操作区,而我们希望表格部分能 自适应浏览器窗口高度 ,在窗口缩放时自动调整高度,让用户始终无需滚动整个页面就能浏览完整表格。

本文将带你一步步实现:Element UI 表格高度自适应布局,包括计算逻辑、生命周期钩子处理、窗口监听等核心技巧。

一、在表格上添加高度参数

Element UI 的 <el-table> 组件支持 heightmax-height 属性来控制表格高度。

要让表格高度动态变化,我们可以绑定一个变量:

js 复制代码
<template>
  <el-table
    :data="tableData"
    :max-height="tableHeight"
  ></el-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [],
      tableHeight: 500, // 默认高度
    };
  },
};
</script>

通过给表格添加 :max-height="tableHeight",即可让表格根据 JS 动态计算的值进行自适应调整。

二、编写计算高度的方法

核心在于动态计算可用空间的高度。

在 Vue 中计算 DOM 尺寸时,需要等页面渲染完成后再进行,因此必须使用 $nextTickrequestAnimationFrame 来确保获取到正确的尺寸。

js 复制代码
methods: {
  // 计算表格高度
  calculateTableHeight() {
    // 等 Vue 更新 DOM 后,再等一帧渲染完成,保证尺寸稳定
    this.$nextTick(() => {
      requestAnimationFrame(() => {
        // 获取视口高度
        const windowHeight = window.innerHeight;
        // 获取筛选区域元素
        const filterEl = document.querySelector('.el-collapse');
        // 获取筛选区域高度
        const filterHeight = filterEl ? filterEl.offsetHeight : 0;
        // 计算表格高度 = 视口高度 - 筛选区域高度 - 其他固定元素高度(头部、边距等)
        this.tableHeight = windowHeight - filterHeight - 100; // 100为其他固定区域的估计值
      });
    });
  },
},

💡 技巧提示:

  • requestAnimationFrame 可以确保在浏览器下一帧绘制前计算尺寸,避免出现抖动或高度错误的问题;
  • 100 可以根据页面实际结构微调,例如顶部导航栏、内边距等的总高度。

三、在合适的生命周期中触发计算

我们需要在三个时机触发高度计算:

  1. 页面加载完成时;
  2. 浏览器窗口尺寸变化时;
  3. 组件销毁前清理事件监听。
js 复制代码
mounted() {
  // 初始计算表格高度
  this.calculateTableHeight();

  // 监听窗口大小变化,重新计算表格高度
  window.addEventListener('resize', this.calculateTableHeight);
},

beforeDestroy() {
  // 组件销毁前移除事件监听,防止内存泄漏
  window.removeEventListener('resize', this.calculateTableHeight);
},

四、完整示例代码

js 复制代码
<template>
  <div>
    <!-- 筛选区域 -->
    <el-collapse class="filter-area">
      <!-- 筛选条件内容 -->
    </el-collapse>

    <!-- 表格区域 -->
    <el-table
      :data="tableData"
      :max-height="tableHeight"
      border
    >
      <el-table-column prop="name" label="姓名"></el-table-column>
      <el-table-column prop="age" label="年龄"></el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [],
      tableHeight: 500,
    };
  },
  methods: {
    calculateTableHeight() {
      this.$nextTick(() => {
        requestAnimationFrame(() => {
          const windowHeight = window.innerHeight;
          const filterEl = document.querySelector('.el-collapse');
          const filterHeight = filterEl ? filterEl.offsetHeight : 0;
          this.tableHeight = windowHeight - filterHeight - 100;
        });
      });
    },
  },
  mounted() {
    this.calculateTableHeight();
    window.addEventListener('resize', this.calculateTableHeight);
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.calculateTableHeight);
  },
};
</script>

<style scoped>
.filter-area {
  margin-bottom: 10px;
}
</style>

五、总结

在 Vue + Element UI 项目中实现表格自适应高度,关键有三点:

  1. 动态绑定 max-height 属性
  2. $nextTick + requestAnimationFrame 中精确计算高度
  3. mountedresize 时机中调用计算函数

这样,你的表格就能优雅地响应浏览器高度变化,避免出现滚动条嵌套或空白区域,让页面布局更干净、体验更流畅。

相关推荐
北辰alk3 分钟前
为什么不建议在 Vue 中同时使用 v-if 和 v-for?深度解析与最佳实践
vue.js
北辰alk5 分钟前
Vue 模板中保留 HTML 注释的完整指南
vue.js
G_G#8 分钟前
纯前端js插件实现同一浏览器控制只允许打开一个标签,处理session变更问题
前端·javascript·浏览器标签页通信·只允许一个标签页
北辰alk18 分钟前
Vue 组件 name 选项:不只是个名字那么简单
vue.js
北辰alk20 分钟前
Vue 计算属性与 data 属性同名:优雅的冲突还是潜在的陷阱?
vue.js
北辰alk20 分钟前
Vue 的 v-show 和 v-if:性能、场景与实战选择
vue.js
@大迁世界23 分钟前
TypeScript 的本质并非类型,而是信任
开发语言·前端·javascript·typescript·ecmascript
Amumu1213837 分钟前
React面向组件编程
开发语言·前端·javascript
计算机毕设VX:Fegn089541 分钟前
计算机毕业设计|基于springboot + vue二手家电管理系统(源码+数据库+文档)
vue.js·spring boot·后端·课程设计
冰暮流星1 小时前
javascript逻辑运算符
开发语言·javascript·ecmascript