vue Table 表格自适应窗口高度,表头固定


当表格内纵向内容过多时,可选择固定表头。
在这里插入图片描述
代码很简单,其实就是在table 里面定一个 height 属性即可。

<template>
  <el-table
    :data="tableData"
    height="250"
    border
    style="width: 100%">
    <el-table-column
      prop="date"
      label="日期"
      width="180">
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名"
      width="180">
    </el-table-column>
  </el-table>
</template>

<script>
  export default {
    data() {
      return {
        tableData: [{
          date: '2016-05-03',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-02',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }]
      }
    }
  }
</script>

问题出现了,不同的屏幕分辨率下,高度是不一样的,如果直接定义成固定的,肯定是不理想的

解决办法

<template>
  <el-table
    :data="tableData"
    :height="windowHeight"
    border
    style="width: 100%">
    <el-table-column
      prop="date"
      label="日期"
      width="180">
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名"
      width="180">
    </el-table-column>
  </el-table>
</template>

<script>
  export default {
    data() {
      return {
        windowHeight: window.innerHeight,
        tableData: [{
          date: '2016-05-03',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-02',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }]
      }
    },
	mounted() {
	  // 监听窗口大小变化事件
	  window.addEventListener('resize', this.handleResize);
	},
	beforeDestroy() {
	  // 移除事件监听器,避免内存泄漏
	  window.removeEventListener('resize', this.handleResize);
	},
	methods: {
	    handleResize() {
	      // 更新窗口高度
	      this.windowHeight = window.innerHeight;
	    }
	 }
  }
</script>

其实就是监听窗口的大小变化,然后动态调整 windowHeight 属性值即可。

到了这一步,基本上满足大部分人的需求,但是如果表格有 合计行 时,此时合计行是不出现的


如下图

在这里插入图片描述

根据调试,发现该问题应该属于组件bug,表格主体中给 footer留的高度不够导致,重新布局即可。

//重置表格
updated() {
   this.$nextTick(() => {
         this.$refs.tableList.doLayout()
     })
 },

doLayout 方法会重新计算表格的布局,适用于以下场景:

  1. 表格数据动态变化:当表格数据发生变化时,调用 doLayout 可以确保表格正确渲染。
  2. 表格尺寸变化:当表格的父容器尺寸发生变化时,调用 doLayout 可以重新调整表格的列宽和行高。
  3. 手动触发布局更新:在某些情况下,表格的布局可能不会自动更新,需要手动调用 doLayout。

逻辑很简单,实现起来也很简单,大家如果解决了问题,点点赞吧

Vue 中实现高度自适应表格并保持表头固定,通常可以采用以下步骤: 1. 使用 `v-for` 和 `v-bind` 指令创建动态表格行,将数据绑定到表格单元格(td)上。 2. 使用 CSS 的 `display: flex` 或者 `grid` 样式来设置表格布局。你可以为tbody元素添加样式,使其撑满可用高度。 3.表头(thead)使用 `position: sticky` 属性,将其顶部定位在视口上方,保持其始终可见。 4. 如果需要滚动功能,可以在 tbody 下方添加一个虚拟滚动区域 (`<div v-loading="isLoading" style="overflow-y:auto; height: calc(100% - ...px);">`),这里需要计算一下 table 头部的高度。 5. 利用 JavaScript 或响应式计算技术(如 Vue 的 `v-bind` 或 `ref` 结合 `window.innerHeight`),动态调整 tbody 的高度,使之跟随视口高度变化。 ```html <template> <div class="scrollable-table"> <thead ref="header"> <!-- 表头内容 --> </thead> <tbody :style="{height: 'calc(100vh - ' + this.headerHeight + 'px)'}"> <tr v-for="(item, index) in items" :key="index"> <!-- 表格单元格 --> </tr> </tbody> </div> </template> <script> export default { data() { return { isLoading: false, headerHeight: this.$refs.header.offsetHeight, items: [] } }, mounted() { this.calculateHeight(); window.addEventListener('resize', this.calculateHeight); }, beforeDestroy() { window.removeEventListener('resize', this.calculateHeight); }, methods: { calculateHeight() { this.headerHeight = this.$refs.header.offsetHeight; // 更新 tbody 高度 } } } </script> <style scoped> .scrollable-table { display: flex; /* 或者 display: grid */ } thead { position: sticky; top: 0; background-color: #f9f9f9; } </style> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值