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…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
