当前位置: 首页 > news >正文

el-table中 el-popover 性能优化

场景:在 el-table 中使用 el-popover ,出现了 loading 加载卡顿的问题,接口返回的数据的时间大概是 140ms ,所以不是接口慢的原因;通过对表中结构的逐步排查,发现是表中的 某一行 所影响的;并且 其中含有 el-popover;因为 el-popover 会渲染出真实的 dom 元素 所以在页面渲染的时候会出现el-table loading 卡顿的情况。
在这里插入图片描述

原来的代码是这样的

<ElTable v-loading="loading" :data="tableData" @selection-change="handleSelectionChange" size="small"show-overflow-tooltip @row-dblclick="handleViewDetail" ref="tableRef":height="tableHeight" highlight-current-row @current-change="handleCurrentRowChange":row-class-name="tableRowClassName"@sort-change="sort_change":cell-style="rowClassName":row-style="{height: '30px'}":header-cell-style="headerClassName">
//...<el-table-column prop="remark" :label="$t('common.remark')" width="100"><template #default="scope"><el-popover :visible="scope.row.visible" placement="top" trigger="click" :width="204"><el-input v-model="scope.row.remark" style="width: 180px;":placeholder="$t('common.email.setBlockSize')"/><div style="text-align: right; margin: 16px 0 0 0;"><el-button size="small" text @click="() => {scope.row.visible = false;scope.row.remark = '';}">{{ $t('common.sss16') }}</el-button><el-button size="small" type="primary" @click="() => {scope.row.visible = false;setRemark(scope.row.mailId, scope.row.remark)}">{{ $t('common.confirm') }}</el-button></div><template #reference><el-icon @click="scope.row.visible = true" :color="scope.row.remark ? '#40a9ff' : '#dddddd'"><el-tooltipv-if="scope.row.remark"class="box-item":content="scope.row.remark"placement="right"><Memo/></el-tooltip><Memo v-else/></el-icon></template></el-popover></template></el-table-column>//...
</ElTable>

解决办法:因为每次都要渲染真实dom;所以可以将 el-popover 抽离 就像 el-dialog 一样;只不过这里有特别的地方是——每行的数据都是不一样的,还需要动态展示每行的数据。

<el-table-column prop="remark" :label="$t('common.remark')" width="100"><template #default="scope"><el-icon :ref="(el) => (refMap[`${scope.row.id}`] = el)"@click="handleRef(refMap[`${scope.row.id}`], scope.row)":color="scope.row.remark ? '#40a9ff' : '#dddddd'"><el-tooltipv-if="emailListCheckoutTarget.remark"class="box-item":content="emailListCheckoutTarget.remark"placement="right"><Memo/></el-tooltip><Memo v-else/></el-icon></template></el-table-column>

抽离的 el-popover

      <el-popovervirtual-triggering:virtual-ref="tempRef"v-model:visible="visiblePopover"placement="top":width="204"trigger="click":popper-options="{modifiers: [{name: 'offset',options: {offset: [8, 8]}}]}"><el-input v-model="emailListCheckoutTarget.remark" style="width: 180px;":placeholder="$t('common.email.setBlockSize')" @keydown.enter.native.stop="okPopover"/><div style="text-align: right; margin: 16px 0 0 0;"><el-button size="small" text @click.stop="cancelPopover">{{ $t('common.sss16') }}</el-button><el-button size="small" type="primary" @click.stop="okPopover">{{ $t('common.confirm') }}</el-button></div></el-popover>

最重要的一点是,采用这种方式,会出现 重复点击该列的目标对象的时候,会出现 visiblePopover 和 trigger 不同步的问题,表现为 el-popover 闪烁一次;所以需要在用户点击的时候重置 el-popover的显隐状态

 	  //真实dom数组const refMap = ref([])//目标dom对象const tempRef = ref(null)//控制 el-popover 的显隐状态const visiblePopover = ref(false)//选中的行数据const emailListCheckoutTarget = ref({})//触发方法const handleRef = (ref, item, type) => {tempRef.value = ref//重置 el-popover 显隐状态visiblePopover.value = false;setTimeout(() => {visiblePopover.value = true;}, 200)emailListCheckoutTarget.value = item;localStorage.setItem('targetItem', JSON.stringify(item.remark))}

其次还要考虑到什么时候渲染指定的行内容;使用 鼠标 移入、移出 事件;

    // 这里是开始点const mouseEnters = throttle((row) => {//localStorage.getItem("targetItem") 这里是特殊处理,可以根据实际情况处理if (localStorage.getItem("targetItem") !== row.remark) {visiblePopover.value = false}if (emailListCheckoutTarget.value.remark !== '') {emailListCheckoutTarget.value = row;}}, 300)const mouseLeaves = throttle((row) => {if (localStorage.getItem("targetItem") === row.remark) {// 防止popover 消失visiblePopover.value = false;}}, 300)

这是两个方法:提交数据;取消提交

  const cancelPopover = () => {visiblePopover.value = false;emailListCheckoutTarget.value.remark = ''}const okPopover = () => {//这是提交到后端setRemark(emailListCheckoutTarget.value.id, emailListCheckoutTarget.value.remark)emailListCheckoutTarget.value = {};visiblePopover.value = false;}

经过上面的一顿操作后,肉眼可见的速度提高了,大约优化了 0.5s 左右。

相关文章:

el-table中 el-popover 性能优化

场景&#xff1a;在 el-table 中使用 el-popover ,出现了 loading 加载卡顿的问题&#xff0c;接口返回的数据的时间大概是 140ms &#xff0c;所以不是接口慢的原因&#xff1b;通过对表中结构的逐步排查&#xff0c;发现是表中的 某一行 所影响的&#xff1b;并且 其中含有 e…...

java数据结构与算法刷题-----LeetCode46. 全排列

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 暴力回溯2. 分区法回溯 1. 暴力回溯 解题思路&#xff1a;时…...

听说过Nginx反向代理,那正向代理是什么?

Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;它以其高性能、稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。在 Nginx 中&#xff0c;正向代理和反向代理是两种常见的代理配置方式&#xff0c;它…...

实现elasticsearch和数据库的数据同步

1. 数据同步 elasticsearch中的酒店数据来自于mysql数据库&#xff0c;因此mysql数据发生改变时&#xff0c;elasticsearch也必须跟着改变&#xff0c;这个就是elasticsearch与mysql之间的数据同步。 1.1. 思路分析 常见的数据同步方案有三种&#xff1a; 同步调用 异步通知…...

SwiftUI的Alert使用方式

SwiftUI的Alert使用方式 记录一下SwiftUI的Alert使用方式&#xff0c;比较简单直接上代码 import SwiftUIstruct AlertBootCamp: View {State var showAlert falsevar body: some View {Button {showAlert.toggle()} label: {Text("alert show")}/// 单按钮 // …...

FPGA高端项目:FPGA基于GS2971的SDI视频接收+GTX 8b/10b编解码SFP光口传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放Video Mixer多路视频拼接应用本方案的SDI接收OSD动态字符叠加…...

【源码编译】Apache SeaTunnel-Web 适配最新2.3.4版本教程

Apache SeaTunnel新版本已经发布&#xff0c;感兴趣的小伙伴可以看之前版本发布的文章 本文主要给大家介绍为使用2.3.4版本的新特性&#xff0c;需要对Apache SeaTunnel-Web依赖的版本进行升级&#xff0c;而SeaTunnel2.3.4版本部分API跟之前版本不兼容&#xff0c;所以需要对 …...

数据集下载

一、数据集下载——谷歌Open images 谷歌Open-image-v6是由谷歌出资标注的一个超大型数据集&#xff0c;数据大小达到600多G&#xff0c;类别达到600多种分类&#xff0c;对于普通研究者而言&#xff0c;根本没办法全部下载下来做测试&#xff0c;也没必要。只需要下载与自己任…...

3、设计模式之工厂模式2(Factory)

一、什么是工厂模式 工厂模式属于创建型设计模式&#xff0c;它用于解耦对象的创建和使用。通常情况下&#xff0c;我们创建对象时需要使用new操作符&#xff0c;但是使用new操作符创建对象会使代码具有耦合性。工厂模式通过提供一个公共的接口&#xff0c;使得我们可以在不暴露…...

npm、nodejs和vue之间关系和区别介绍

本文讲解npm、Node.js和Vue.js这三者之间的关系和区别&#xff0c;以及它们各自的特点。 首先&#xff0c;让我们来了解一下Node.js。 **Node.js** 是一个开源的服务器端运行环境&#xff0c;它允许开发者使用JavaScript来编写服务器端的代码。在传统的Web开发中&#…...

DM数据库安装(Windows)

先解压安装包 点击setup安装 下一步 勾选接受然后下一步 下一步 选择典型安装下一步 下一步 搜索DM数据库配置助手然后一直下一步 然后搜索DM管理工具 登录 登录成功 widows版本安装成功...

Python的asyncio 多线程

-- 多线程、进程、协程是什么就不讲了&#xff0c;&#xff08;就是你理解的一边呼吸&#xff0c;一边看文章&#xff09; 仅解决问题的话&#xff0c;下边两篇不用看&#xff0c; Python 中的 async await 概念-CSDN博客 再深一点的看这个 Python中的多线程、进程、协程、…...

【分类讨论】【解析几何】【 数学】【推荐】1330. 翻转子数组得到最大的数组值

作者推荐 视频算法专题 本文涉及知识点 分类讨论 解析几何 LeetCode1330. 翻转子数组得到最大的数组值 给你一个整数数组 nums 。「数组值」定义为所有满足 0 < i < nums.length-1 的 |nums[i]-nums[i1]| 的和。 你可以选择给定数组的任意子数组&#xff0c;并将该子…...

一文了解Spring的SPI机制

文章目录 一文了解Spring的SPI机制Java SPIServiceLoader Spring SPISpringboot利用Spring SPI开发starter 一文了解Spring的SPI机制 Java SPI SPI 全称 Service Provider Interface &#xff0c;是 Java提供的一套用来被第三方实现或者扩展的接口&#xff0c;它可以用来启用…...

django根据时间(年月日)动态修改表名--方法一

方法一&#xff1a; 第一步&#xff1a;在models创建一个类&#xff0c;里边存放数据表中需要的字段&#xff0c;如下 class TemplateModel(models.Model):NowTime models.CharField(max_length5)name models.CharFiedld(max_length5)class Meta:abstract True # 基础类设…...

实现基本的登录功能

一、登录功能的前端处理过程 1、导入项目所需的图片和CSS等静态文件 参考代码存放client节点的/opt/code目录下 执行如下命令&#xff1a; [rootclient ~]# cp -r /opt/code/kongguan_web/src/assets/* /root/kongguan_web/src/assets/ 将参考代码中的css、icon、images等文…...

Java线程池实现原理及其在美团业务中的实践

随着计算机行业的飞速发展&#xff0c;摩尔定律逐渐失效&#xff0c;多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。 J.U.C提供的线程池&#xff1a;ThreadPoolExecutor类&#xff0c;帮助开发人员管理线程并方便地执行并行任务。了解并合理…...

让AI给你写代码(四)—— 初步利用LangChain Agent根据输入生成,保存,执行

要进一步提升智能编码助手的效率&#xff0c;我觉得需要做到两点 1&#xff09; 进一步让主人聚焦于设计输入以及结果验证的循环 2&#xff09; 进一步让智能编码助手聚焦于代码实现和程序流程&#xff08;保存、打开&#xff0c;修订、执行、合并…&#xff09; 正好接触到LLM…...

Flutter does not exist

Flutter does not exist 原因&#xff1a;Generated.config 配置文件内路径缺失 原因&#xff1a;Flutter SDK缺失 通过配置文件查到Flutter SDK在本地的存放位置FLUTTER_FRAMEWORK_DIR/Users/haijunyan/Documents/flutter/bin/cache/artifacts/engine/ios 真机所需&#xf…...

AIX上安装gcc和g++

AIX的iso镜像中没有gcc的软件包&#xff0c;需要我们自己下载&#xff0c;我们可以在 Index of /download/rpmdb/deplists/aix72 下载对应gcc和g版本的依赖文件deps 我们使用的是4.9.4版本的软件包 我们首先安装gcc&#xff0c;在http://www.oss4aix.org/download/everythi…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...