antdv树形表格 大量tooltip等组件导致页面卡顿问题优化

news2024/12/23 17:32:50

vue3、ant-design-vue 4.2.3

遇到的问题:页面中有个展示树形数据的表格,默认需要全部展开,有一组数据量较大时页面首次渲染时非常卡顿,发现每次都大概用了7、8秒才完成渲染。表格展开的数据大概300条数据,操作列中有5种仅展示了图标的按钮,每个按钮包裹在Tooltip中,删除和特殊按钮还有PopComfirm组件的交互。大概如下图。
在这里插入图片描述

解决思路:树形表格不能用分页去优化,改虚拟滚动还得动组件比较耗时改动很大,排查后发现表格本身加载300条数据大概在500毫秒的样子,但是加入了操作列后速度明显变慢,隐藏了tooltip和confirm组件后速度就上来了。所以我的思路是,表格的渲染分为两步,先渲染纯数据列,延迟操作列内的组件渲染,且操作列只渲染纯图标,当鼠标移入行内后再加载单元格内的tooltip、confirm组件。为了优化使用体验,还增加了loading状态。

优化前后对比:虽然还有2秒左右,但是其他数据量都很小,几十几百毫秒就完成全部渲染,体验上已经可以了,所以还是很满意的。比心~~~

代码逻辑简单示意:

<a-table 
:columns="columns" 
:data-source="data"
:expanded-row-keys="expandedRowKeys"
>
<template #bodyCell="{ column, text, record }">
	<template v-if="column.dataIndex !=='action'">
		{{ text }}
	</template>
	<!-- 操作列 -->
	<template v-else>
		// 默认不渲染这里,仅鼠标移入后才渲染该行
		<span v-if="loadBtn">
			<span v-if="tooltipVisible[record.key]" @mouseenter="setTooltopVisible(record.key, true)">
				<a-tooltip title="操作按钮xxx">
					<a-button><icon1/></a-button>
				</a-tooltip>
			</span>
			<span v-else>
				// 首次渲染,仅展示图标渲染更快,实际可操作组件在上面,鼠标移入后加载
				<icon1>
				<icon2>
				<icon3>
				//...
			</span>
		</span>
		<span v-else>
			<LoadingOutlined />
		</span>
	</template>
</template>
</a-table>

<script setup>
	const columns = ref([{..省略表头..}])
	const data = ref([])
	const expandedRowKeys = ref([])
	const loadBtn = ref(false)
	const tooltipVisible = ref({})
	// 如果考虑鼠标会快速多行滑过的问题,可以使用debounce去处理setTooltopVisible函数
	const setToolipVisible = (key) => {
		tooltipVisible.value[key] = true // 表格如果是动态数据的话,记得每次重新赋值tableData时清空tooltipVisible就行了
	}
	//下面这段逻辑放在接口处理动态渲染表格也是一样的
	onMounted(() => {
		data.value = result // 每行数据需要有唯一的标识值,用来记录更新渲染的行,例子中是 key
		expandedRowKeys.value = ['',,,] // 默认展开全部行,动态请求更新数据的话,需要递归遍历表格数据添加到ExpandedRowKeys中,这里不写了
		// 用定时器将线程改为异步,否则loadBtn将会卡住不展示。操作列loading占位加载单元格内的组件,可以提升用户体验
		setTimeout(() => {
			loadBtn = true
		}, 100)
	})
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2202952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot框架下的服装生产管理系统

1 绪论 1.1 研究背景 当今时代是飞速发展的信息时代。在各行各业中离不开信息处理&#xff0c;这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制&#xff0c;不仅提高了工作效率&#xff0c;而且大大的提高…

leetcode:反转字符串中的单词III

题目链接 string reverse(string s1) {string s2;string::reverse_iterator rit s1.rbegin();while (rit ! s1.rend()){s2 *rit;rit;}return s2; } class Solution { public:string reverseWords(string s) {string s1; int i 0; int j 0; int length s.length(); for (i …

2024年【金属非金属矿山(地下矿山)安全管理人员】复审考试及金属非金属矿山(地下矿山)安全管理人员在线考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员复审考试考前必练&#xff01;安全生产模拟考试一点通每个月更新金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员在线考试题目及答案&#…

防汛可视化系统:提升应急响应能力

通过图扑可视化系统实时监测水情、雨情和地理数据&#xff0c;辅助防汛决策与调度&#xff0c;提供直观的风险预警信息&#xff0c;从而优化资源分配&#xff0c;提高防汛应急响应效率。

进程通讯方式区别(从不同角度看)

*常用到的不同主机间进程通讯&#xff1a;Socket。比如&#xff1a;host和引擎间socket指令通讯、分派和复判之间指令通讯&#xff1b; *共享内存&#xff1a;在Windows系统中&#xff0c;共享内存的实现通常有以下几种方式&#xff1a; 1.内存映射文件(最常用)&#xff1a;(…

linux上的smb共享文件夹

需求描述 公司的打印机使用扫描功能的时候&#xff0c;需要发送大量文件。然鹅公司的电脑都是加入了AzureAD的&#xff0c;不能在公司电脑上简单设置共享。好在公司有很多阿里云上的服务器&#xff0c;Linux和Windows的都有&#xff0c;所以就来尝试用阿里云的服务器来进行smb…

正点原子学习笔记之汇编LED驱动实验

1 汇编LED原理分析 为什么要写汇编     需要用汇编初始化一些SOC外设     使用汇编初始化DDR、I.MX6U不需要     设置sp指针&#xff0c;一般指向DDR&#xff0c;设置好C语言运行环境 1.1 LED硬件分析 可以看到LED灯一端接高电平&#xff0c;一端连接了GPIO_3上面…

华捷艾米3D结构光模组测试

1.测试项目总览 本次测试主要测试以下几个方面&#xff1a; 模组的基本属性和SDK基本功能&#xff1b;华捷艾米提供的人脸防伪算法性能&#xff1b;模组的逆光性能。 2.基本属性和SDK基本功能 图像属性&#xff1a; 模组提供的3d深度数据标称分辨率最大为640x480&#xff0…

软件测试学习笔记丨MongoDB

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32359 一、MangoDB数据库 1.1 关系与非关系 1.1.1 关系型数据库 关系型数据库 MySQL&#xff0c;Oracle&#xff0c; SQLServer&#xff0c; Access…SQL&#xff08;结构化查询语句&#x…

[图形学]smallpt代码详解(上)

一、简介 本文介绍了著名的99行代码实现全局光照的光线跟踪代码smallpt。 包括对smallpt的功能介绍、编译运行介绍&#xff0c;和对代码的详细解释。希望能够帮助读者更进一步的理解光线跟踪。 二、smallpt介绍 1.smallpt是什么 smallpt(small Path Tracing) 是一个全局光照…

微信服务号灰度测试折叠,看谁该慌了?

2024年国庆节前夕&#xff0c;突然发现我的微信的会话列表清静了不少。 紧接着&#xff0c;我马上就慌了... &#x1f914;怎么“丰巢快递”不见了&#xff0c;我要找取件码 &#x1f914;我的flomo浮墨笔记公众号呢&#xff1f;我要记笔记啊 &#x1f914;这个月怎么没有…

3个步骤轻松集成Push Kit,实现App消息推送

推送通知作为App重要的消息传递工具&#xff0c;广泛应用于电子商务、社交媒体、旅游交通等领域的通知场景。比如当应用有新功能或安全补丁时&#xff0c;系统将推送消息提醒用户及时更新&#xff1b;如果是航班出行类的应用&#xff0c;会发送最新的班次时间表给用户&#xff…

44 C 语言输入输出流、scanf 与 printf 函数详解、清除输入缓冲区

目录 1 文件基本介绍 1.1 文件的主要功能 1.2 输入输出流 2 C 语言中的输入与输出 2.1 输入 2.2 输出 2.3 标准文件与文件指针 3 scanf() 函数详解 3.1 功能描述 3.2 函数原型 3.3 常用格式说明符 3.4 返回值 3.5 注意事项 3.5.1 处理空白字符 3.5.2 防止缓冲区…

基于K-means和RFM模型的电商行业用户画像及商品个性化推荐研究

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍数据概览数据预处理可视化过程展示RFM模型K-means及改进算法每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 本研究基于阿里天池…

玩转OurBMC第十一期:kdump原理分析(上)

栏目介绍&#xff1a;“玩转OurBMC”是OurBMC社区开创的知识分享类栏目&#xff0c;主要聚焦于社区和BMC全栈技术相关基础知识的分享&#xff0c;全方位涵盖了从理论原理到实践操作的知识传递。OurBMC社区将通过“玩转OurBMC”栏目&#xff0c;帮助开发者们深入了解到社区文化、…

echarts 中添加图片/图标

let myChart echarts.init(this.$refs.chartOne); // 注意这里的 ref 引用 myChart.setOption({ tooltip: {trigger: item,formatter: {b} : {c}},series: [{type: pie,radius: 50%,data: this.swjList,label: {formatter: (params) > {if (params.name ! ) {let percent…

代码随想录 -- 回溯 -- N皇后

51. N 皇后 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 从抽象树中可以看出递归的层数取决于棋盘的行数&#xff0c;for循环的次数取决于棋盘的列数。 递归参数&#xff1a;存放当前棋盘的数组chessboard、当前行row、总行数n。递归终止条件&#xff1a;当 ro…

【C++网络编程】(二)Linux平台下UDP客户/服务端程序

Linux平台下UDP客户/服务端程序 图片来源&#xff1a;https://subingwen.cn/linux/udp/ UDP服务器无法直接检测客户端断开连接。 UDP 服务端 server.cpp #include <iostream> #include <cstdlib> // std::exit #include <cstring> // memset #i…

在线制作PPT图表!这个好用轻量的ppt软件值得推荐!

ppt图表怎么制作&#xff1f; ppt是一种可以承载多种内容形式的媒介&#xff0c;我们在一个ppt页面中添加文本、形状、图片、视频、图表、思维导图等&#xff0c;对于其中的图表&#xff0c;在ppt中应该怎么制作呢&#xff1f; Office Powerpoint是很多人非常熟悉的演示软件&…

【宽搜】5.leetcode 199 二叉树的右视图

1 题目描述 题目链接&#xff1a;二叉树的右视图 2 题目解析 思路&#xff1a; 可以运用 层序遍历&#xff0c; 将每一层的结点值存入到vector< int >中&#xff0c;然后对每一层的vector&#xff0c;将vector的最后一个值加入到结果的vector中去 层序遍历的模板可以…