Vue.js 动态设置表格最大高度的实现
概述
在现代 Web 开发中,响应式设计至关重要,尤其是在处理复杂的布局和数据表格时。表格通常会受到多种因素的影响,如分页、合计行或动态内容,这可能导致表格高度的变化。本文将介绍一个基于 Vue.js 的方法 setMaxHeight
,该方法动态计算和设置表格的最大高度,确保表格始终能在可视区域内显示,而不受其它元素的干扰。
目标
- 通过计算可用空间并自动调整表格高度,确保表格显示在合适的区域内。
- 动态处理不同布局和页面元素的高度变化,如分页、合计行等。
- 提供可维护、可扩展的解决方案,适应不同表格组件库(如
el-table
和ivu-table
)的要求。
代码分析
export default {data() {return {maxHeight: 0, // 表格最大高度};},methods: {/*** 动态计算表格最大高度* 1. 根据容器的总高度减去非表格元素的高度来计算表格的最大高度* 2. 支持分页、合计行等因素的动态变化* * @param {HTMLElement} e - 表格容器元素*/setMaxHeight(e) {if (!e) return; // 如果未传入容器元素,直接返回// 过滤掉表格本身(ivu-table-wrapper、el-table)以及v-resize生成的object节点const otherEle = Array.from(e.children).filter(item => !item.classList.contains('ivu-table-wrapper') && !item.classList.contains('el-table') && item.nodeName !== 'OBJECT');// 计算过滤后的其它元素的高度之和const otherHeight = otherEle.reduce((sum, item) => sum + item.clientHeight, 0);// 判断表格是否包含合计行const hasSummary = Array.from(e.children)[0].classList.contains('ivu-table-with-summary');// 计算表格最大高度this.maxHeight = e.clientHeight - otherHeight - (hasSummary ? 36 : 0);},},
};
代码逻辑
-
初始化数据: 在 Vue 组件的
data
中,定义一个maxHeight
属性来存储计算得到的最大表格高度。 -
setMaxHeight
方法:- 参数说明:方法接受一个 DOM 元素
e
,该元素通常是包含表格及其他子元素的容器。 - 判断空值:首先检查是否传入有效的容器元素
e
,如果为空,直接返回。
- 参数说明:方法接受一个 DOM 元素
-
过滤非表格节点:
- 使用
Array.from
将e.children
转化为数组,并通过filter
方法排除掉类名为ivu-table-wrapper
或el-table
的子元素,以及OBJECT
类型的节点(可能是由v-resize
或其他插件生成的用于调整大小的元素)。
- 使用
-
计算其它元素的总高度:
- 通过
reduce
方法遍历所有非表格元素,并累加它们的clientHeight
,即元素的可视高度。
- 通过
-
检查是否包含合计行:
- 检查表格容器的第一个子元素是否包含
ivu-table-with-summary
类名来判断是否显示合计行。如果存在合计行,额外减去 36px。
- 检查表格容器的第一个子元素是否包含
-
计算最大高度:
- 最终,通过减去非表格元素的总高度以及合计行的高度(如果有的话),计算出表格的最大高度
maxHeight
,并将其赋值给组件的数据属性maxHeight
。
- 最终,通过减去非表格元素的总高度以及合计行的高度(如果有的话),计算出表格的最大高度
使用场景
此方法适用于需要动态调整表格高度的场景,尤其是在以下情况下:
- 页面布局中包含分页元素,且分页高度可能会动态变化。
- 表格中可能包含合计行或其他特殊行,需要在计算表格高度时考虑其额外占用的空间。
- 表格容器的高度是固定的,但内部内容可能会随时间或用户交互而变化,导致表格需要重新调整高度。
示例
假设你在 Vue 组件中使用了 el-table
或 ivu-table
,并希望根据容器的高度动态设置表格的最大高度:
<template><div class="table-container" ref="tableContainer" @resize="setMaxHeight($refs.tableContainer)"><el-table :data="tableData" :max-height="maxHeight"><!-- 表格内容 --></el-table></div>
</template><script>
import { ref, onMounted } from 'vue';export default {setup() {const tableData = ref([]);const maxHeight = ref(0);onMounted(() => {// 在组件挂载完成后,初始化最大高度this.setMaxHeight(this.$refs.tableContainer);});return {tableData,maxHeight,setMaxHeight,};},
};
</script>
性能优化
-
减少不必要的 DOM 操作:
- 在每次页面大小或布局变化时调用
setMaxHeight
方法时,确保只进行必要的 DOM 查询和计算。可以考虑节流(throttle)或防抖(debounce)技术,避免频繁执行。
- 在每次页面大小或布局变化时调用
-
缓存结果:
- 如果表格容器的大小变化不频繁,可以考虑缓存计算结果,避免重复计算。
总结
setMaxHeight
方法是一个实用的解决方案,帮助开发者动态调整表格的最大高度,确保表格在各种布局下都能自适应地显示。通过过滤非表格节点、计算其它元素的高度并考虑合计行的影响,能够灵活地处理复杂的布局和交互场景。
相关文章:
Vue.js 动态设置表格最大高度的实现
概述 在现代 Web 开发中,响应式设计至关重要,尤其是在处理复杂的布局和数据表格时。表格通常会受到多种因素的影响,如分页、合计行或动态内容,这可能导致表格高度的变化。本文将介绍一个基于 Vue.js 的方法 setMaxHeight…...

Java测试开发平台搭建(九)前端
1. 搭建前端vue环境 Vue3 安装 | 菜鸟教程 2. 创建项目 1.进入ui vue ui 2. create项目 3. 成功之后添加插件: cli-plugin-router vue-cli-plugin-vuetify 4. 添加依赖 axios 5. 点击任务开始运行 如果报错: 修改vue.config.jsconst { defineConfig }…...
MySQL多表查询练习
1.找出销售部门中年纪最大的员工的姓名 mysql> select name,age from dept a ,emp_new b where a.dept1b.dept2 and dept_name销售order by age desc limit 1; ------------ | name | age | ------------ | 荣七 | 64 | ------------ 1 row in set (0.00 sec) 2.求财务…...

低代码运维与管理服务
文章目录 前言一、服务内容二、服务范围三、服务流程四、服务交付件五、责任矩阵六、验收标准 前言 随着云计算技术的发展,数字化转型是企业的必然选择,企业需要实现广泛的连接并走向开放,传统集成工具无法满足当前企业面临的数字化转型诉求…...
【机器学习:三十二、强化学习:理论与应用】
1. 强化学习概述 **强化学习(Reinforcement Learning, RL)**是一种机器学习方法,旨在通过试验与反馈的交互,使智能体(Agent)在动态环境中学习决策策略,以最大化累积奖励(Cumulative…...

解决wordpress媒体文件无法被搜索的问题
最近,我在wordpress上遇到了一个令人困扰的问题:我再也无法在 WordPress 的媒体库中搜索媒体文件了。之前,搜索媒体非常方便,但现在无论是图片还是其他文件,似乎都无法通过名称搜索到。对于我这样需要频繁使用图片的博主来说,这简直是个大麻烦。 问题源头 一开始,我怀…...

【2024年华为OD机试】(B卷,100分)- 增强的strstr (Java JS PythonC/C++)
一、问题描述 题目描述 C 语言有一个库函数 char *strstr(const char *haystack, const char *needle),用于在字符串 haystack 中查找第一次出现字符串 needle 的位置,如果未找到则返回 null。 现要求实现一个 strstr 的增强函数,可以使用…...

【前端】CSS学习笔记
目录 CSS的简介CSS的概念语法 CSS的引入方式内联样式(行内样式)内部样式外部样式(推荐) 选择器全局选择器元素选择器类选择器ID选择器合并选择器后代选择器子选择器相邻兄弟选择器通用兄弟选择器伪类选择器:link:visited:hover:ac…...

项目架构调整,新增sunrays-combinations模块
文章目录 1.介绍2.环境搭建1.sunrays-framework下新建sunrays-combinations模块2.删除src3.pom.xml4.查看是否交给sunrays-framework管理5.删除sunrays-common中module引用的common-core-starter6.sunrays-combinations统一管理子模块7.common-all-starter的父模块修改为sunray…...

linux网络编程11——线程池
1. 线程池 1.1 池化技术原理 池化技术 当一个资源或对象的创建或者销毁的开销较大时,可以使用池化技术来保持一定数量的创建好的对象以供随时取用,于是就有了池式结构。常见的池式结构包括线程池、内存池和连接池。 池化技术应用的前提条件主要包括三…...

MySQL - 主从同步
1.主从同步原理: MySQL 主从同步是一种数据库复制技术,它通过将主服务器上的数据更改复制到一个或多个从服务器,实现数据的自动同步。 主从同步的核心原理是将主服务器上的二进制日志复制到从服务器,并在从服务器上执…...

基于微信小程序的安心陪诊管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...

深入剖析iOS网络优化策略,提升App性能
一、引言 在当今移动互联网时代,iOS 应用的网络性能直接关系到用户体验。无论是加载速度缓慢、频繁的网络错误,还是高额的流量消耗,都可能导致用户流失。因此,iOS 网络优化成为开发者提升应用质量、增强用户满意度的关键环节。本文…...
游戏开发中常用的设计模式
目录 前言一、工厂模式二、单例模式三、观察者模式观察者模式的优势 四、状态模式状态模式的优势 五、策略模式策略模式的优势 六、组合模式七、命令模式八、装饰器模式 前言 本文介绍了游戏开发中常用的设计模式,如工厂模式用于创建对象,单例模式确保全…...
【PyCharm】远程连接Linux服务器
【PyCharm】相关链接 【PyCharm】连接Jupyter Notebook【PyCharm】快捷键使用【PyCharm】远程连接Linux服务器【PyCharm】设置为中文界面 【PyCharm】远程连接Linux服务器 PyCharm 提供了远程开发的功能,使得开发者可以在本地编辑代码或使用服务器资源。 下面将详…...

InVideo AI技术浅析(五):生成对抗网络
一、特效生成 1. 工作原理 特效生成是计算机视觉中的高级应用,旨在通过算法生成高质量的视觉特效,如风格迁移、图像到图像的翻译等。InVideo AI 使用生成对抗网络(GAN)来实现这一功能。GAN 通过生成器和判别器两个网络的对抗训练,生成逼真的视觉特效。 2. 关键技术模型…...

Spring自定义BeanPostProcessor实现bean的代理
上文中:https://blog.csdn.net/qq_26437925/article/details/145241149 大致了解了spring aop的代理的实现,其实就是有个BeanPostProcessor代理了bean对象。 本文直接编写最简单的代码直观感受下 bean A: Service public class A {public A() {System.…...

【HF设计模式】06-命令模式
声明:仅为个人学习总结,还请批判性查看,如有不同观点,欢迎交流。 摘要 《Head First设计模式》第6章笔记:结合示例应用和代码,介绍命令模式,包括遇到的问题、采用的解决方案、遵循的 OO 原则、…...
Linux使用SSH连接GitHub指南
基础配置流程 步骤1:生成SSH密钥 打开终端:首先,打开你的Linux终端。 生成SSH密钥对:输入以下命令来生成一个新的SSH密钥对: ssh-keygen -t rsa -b 4096 -C "your_email@example.com"-t rsa:使用RSA加密算法生成密钥。-b 4096:密钥长度为4096位,增加安全性。…...
v2富文本框封装 @wangeditor/editor-for-vue
1 组件封装 <template><div class"editor-container"><div class"editor-wrapper"><Toolbarstyle"border-bottom: 1px solid #ccc":editor"editor":defaultConfig"toolbarConfig":mode"mode&quo…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...