element-plus 工作经验总结

Element-plus

文章目录

  • Element-plus
    • 忠告: 最好锁定版本, 免得更新更出 BUG 来了
    • el-drawer 设置 modal="false" 后, 遮罩元素仍存在, 点不了空白的地方
    • el-tree 大数据量时接收 check-change 事件报错导致涉及多个节点的操作没执行完毕
    • el-table 表头 show-overflow-tooltip 无效解决办法 / 设置 class 控制全局超长隐藏, 以 el-tooltip 显示全部内容

忠告: 最好锁定版本, 免得更新更出 BUG 来了

遇到两次了, 没锁定 element-plus 版本, 打包后样式乱了, 逻辑变了…

el-drawer 设置 modal=“false” 后, 遮罩元素仍存在, 点不了空白的地方

有两个思路:

  1. 通过 modal-class 把遮罩层样式改了, 让它只是看起来不显示, 这样 close-on-click-modal 应该能生效
    这个方案改动小, 但是满足不了产品需求 — “点击其他表格行时, 可切换侧滑页内容”, 于是引入 vueuse 的 onClickOutside 做了方案 2
  2. 方案2, 步骤如下:
    1. 给 drawer 和 modal 加上 pointer-events 相关 class , 让点击可以穿透遮罩层
    2. 使用 onClickOutside, 传入 handler 函数关闭 drawer , 传入 options.ignore , 指定忽略表格行(侧滑页的入口元素)的 css 选择器
    3. 如果 drawer 内部有弹框, 可以加上弹框遮罩的 class 选择器, 避免点击弹框时把 drawer 也关了

el-tree 大数据量时接收 check-change 事件报错导致涉及多个节点的操作没执行完毕

背景:

数据量大的时候(选中一个底下有很多子级的节点)check-change 事件不断触发, 到了 100 出头时, 接收事件处理的方法就一直报错了(发版后不报错, 但逻辑同样受影响), 不会处理后续逻辑了

定位:

本地运行开发环境里有报错, 错误信息里说的是数据更新影响到渲染了, 那就减少相关操作吧

解决

于是在接收处首先 await nextTick() 一下, 攒够一波了一起执行后续逻辑 -> 更新数据 -> 视图更新

如果之后还有问题, 那再整 setTimeout , 队列之类的吧, 或者干脆不用 check-change 事件了

el-table 表头 show-overflow-tooltip 无效解决办法 / 设置 class 控制全局超长隐藏, 以 el-tooltip 显示全部内容

背景:

UI 要求表头也要超长隐藏, 鼠标移入 tooltip 显示全局内容

思路:

之前的项目是用 render-header 实现的, 新项目用 render-heade 少, 觉得逐个表格写 render-header 控制显隐/ title 属性太麻烦, 于是复制 element-plus 的 show-overflow-tooltip 部分相关代码, 实现设置 class “showOverflowTooltip” 即可超长显示 tooltip (设置 class 就行, 跟表格没关系, 普通 div 设置了也能显示), 原理为 — 全局监听 .showOverflowTooltip mouseover , 以虚拟 ref 显示全局 el-tooltip ,

具体代码

// APP.VUE<template><!-- ... --><!-- 全局 tooltip --><el-tooltipv-model:visible="visible":content="content"placement="top-start"effect="dark"trigger="hover":show-after="500"virtual-triggering:virtual-ref="triggerRef"></el-tooltip>
</template><script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue';
import { checkIsOverflow } from 'src/utils/dom.js';// ...// 全局, 以虚拟 ref 触发指定 class (.showOverflowTooltip) 鼠标移入显示 overflow tooltip
// 手动控制显隐(暂时没用到)
const visible = ref(false);
// tooltip 内容
const content = ref('');
// 虚拟 ref 指定 DOM
const triggerRef = ref(null);
// 全局监听 mouseover 鼠标移入, 控制虚拟 ref
const globalOnMouseOver = e => {const targetEl = e.target;// 鼠标移入的元素包含特定 class + 内容超出, 则设置虚拟 ref + content (popper 以 trigger: hover 显示)if (targetEl.classList.contains('showOverflowTooltip') && checkIsOverflow(targetEl)) {content.value = targetEl.innerText || targetEl.textContent;triggerRef.value = targetEl;}
};// 添加事件监听
onMounted(() => {document.getElementById('vue应用根元素id').addEventListener('mouseover', globalOnMouseOver);
});// 移除事件监听
onBeforeUnmount(() => {document.getElementById('vue应用根元素id').removeEventListener('mouseover', globalOnMouseOver);
});
</script><style lang="scss">.showOverflowTooltip, .showOverflowTooltip > * {max-width: 100%;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}
</style>
// src/utils/dom.js// 判断是否 text-overflow
// 参考 element-plus : https://github.com/element-plus/element-plus/blob/dev/packages/components/table/src/table-body/render-helper.ts
export const checkIsOverflow = (el) => {// use range width instead of scrollWidth to determine whether the text is overflowing// to address a potential FireFox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1074543#c3const range = document.createRange();range.setStart(el, 0);range.setEnd(el, el.childNodes.length);/** detail: https://github.com/element-plus/element-plus/issues/10790*  What went wrong?*  UI > Browser > Zoom, In Blink/WebKit, getBoundingClientRect() sometimes returns inexact values, probably due to lost precision during internal calculations. In the example above:*    - Expected: 188*    - Actual: 188.00000762939453*/let { width: rangeWidth, height: rangeHeight } = range.getBoundingClientRect();const offsetWidth = rangeWidth - Math.floor(rangeWidth);const { width: cellChildWidth, height: cellChildHeight } = el.getBoundingClientRect();if (offsetWidth < 0.001) {rangeWidth = Math.floor(rangeWidth);}const offsetHeight = rangeHeight - Math.floor(rangeHeight);if (offsetHeight < 0.001) {rangeHeight = Math.floor(rangeHeight);}const { top, left, right, bottom } = getPadding(el);const horizontalPadding = left + right;const verticalPadding = top + bottom;if (rangeWidth + horizontalPadding > cellChildWidth ||rangeHeight + verticalPadding > cellChildHeight ||el.scrollWidth > cellChildWidth) {return true;}return false;
};
// 获取 el padding
export const getPadding = (el) => {const style = window.getComputedStyle(el, null);const paddingLeft = Number.parseInt(style.paddingLeft, 10) || 0;const paddingRight = Number.parseInt(style.paddingRight, 10) || 0;const paddingTop = Number.parseInt(style.paddingTop, 10) || 0;const paddingBottom = Number.parseInt(style.paddingBottom, 10) || 0;return {left: paddingLeft,right: paddingRight,top: paddingTop,bottom: paddingBottom};
};export default {checkIsOverflow,getPadding
};

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

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

相关文章

前端小程序调用 getLocation 实现地图位置功能,通过 纬度:latitude 经度: longitude 获取当前位置

1、首先登录一下 腾讯的位置服务 有账号就登录没账号就注册&#xff0c; 点击右上角的控制台点击左侧的应用管理 ---> 我的应用 ---->> 创建应用 1、创建应用 2、列表就会显示我们刚刚创建好的 key 3、点击添加 key 4、按照要求填写信息 我们用的是小程序 所以选择…

二叉树介绍

引入 定义 区别 定义不同 形态不同 基本形态

AD域服务器巡检指南

Active Directory (AD) 域服务器的巡检对于确保企业网络的安全性和高效运行至关重要。以下是针对AD域服务器巡检的关键活动和其重要性的优化描述&#xff1a; 保证系统安全&#xff1a; AD域服务器储存大量敏感数据&#xff0c;包括用户账户信息、策略和访问权限数据。定期巡检…

windows和 Linux 下通过 QProcess 打开ssh 和vnc

文章目录 SSHSSH验证启动SSH一、口令登录二、公钥登录通过Qprocess 启动ssh VNC Viewer简介通过QProcess启动vncViewer SSH Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的**安全网络协议**。它是专为远程登录会话(**甚至可以…

uniapp下拉选择组件

uniapp下拉选择组件 背景实现思路代码实现配置项使用尾巴 背景 最近遇到一个这样的需求&#xff0c;在输入框中输入关键字&#xff0c;通过接口查询到结果之后&#xff0c;以下拉框列表形式展现供用户选择。查询了下uni-app官网和项目中使用的uv-ui库&#xff0c;没找到符合条…

微信小程序中的图像奥秘:图片与Base64的华丽变身记

微信小程序中的图像奥秘&#xff1a;图片与Base64的华丽变身记 基本概念解析图片与Base64的关系为何转换 图片转Base64实战微信小程序使用wx.getImageInfo获取图片信息图片转换为Base64注意 Base64转图片直接在小程序页面显示云开发环境转换注意 遇遇问题排查思路结语引发讨论 …

前端开发工程师——ajax

express框架 终端输入 npm init --yes npm i express 请求报文/响应报文 // 1.引入express const express require(express);// 2.创建应用对象 const app express();// 3.创建路由规则 // request:是对请求报文的封装 // response&#xff1a;是对响应报文的封装 app.get(…

【御控物联】Java JSON结构转换、JSON协议转换、JSON属性互换(15):对象To数组——转换映射方式

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON对象 To JSON数组》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

Vue3自定义封装音频播放组件(带拖拽进度条)

Vue3自定义封装音频播放组件&#xff08;带拖拽进度条&#xff09; 描述 该款自定义组件可作为音频、视频播放的进度条&#xff0c;用于控制音频、视频的播放进度、暂停开始、拖拽进度条拓展性极高。 实现效果 具体效果可以根据自定义内容进行位置调整 项目需求 有播放暂停…

XSS实战漏洞挖掘

接下来一年时间将会主要研究渗透测试方向的众多问题&#xff0c;文章中的内容也会在后面定期更新。本文主要记录了一些XSS漏洞挖掘中的实用心得和学习笔记。 漏洞描述 漏洞描述&#xff1a;跨站脚本攻击的英文全称是Cross Site Script&#xff0c;为了和样式表区分&#xff0…

python实现pip一键切换国内镜像源脚本分享

本文主要分享一个自己写的pip一键切换国内镜像源python脚本 import subprocess# pip 国内镜像源加速 source_urls [{"name": "默认镜像源", "url": ""},{"name": "清华大学镜像源(推荐使用)", "url": …

sqlserver数据库日志文件log.ldf文件占用过大清除的办法

sqlserver数据库日志文件log.ldf文件占用过大清除的办法 技术交流 http://idea.coderyj.com/ 1.清除数据库日志的方法 --- 查看数据库日志文件名 USE cs GO SELECT file_id, name,size,* FROM sys.database_files;ps 可以看到其中name字段为数据库日志名称"数据库日志名称…

【MATLAB源码-第206期】基于matlab的差分进化算法(DE)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 差分进化算法&#xff08;Differential Evolution, DE&#xff09;是一种有效的实数编码的进化算法&#xff0c;主要用于解决实值函数的全局优化问题。本文将详细介绍差分进化算法的背景、原理、操作步骤、参数选择以及实际应…

返回分类信息(带层级)

文章目录 1.前端展示分类管理信息1.目前项目架构2.启动前后端项目1.启动mysql容器2.启动后端 renren-fast3.启动前端1.界面2.用户名密码都是admin 3.创建分类管理菜单1.菜单管理 -> 新增 -> 新增目录2.刷新3.能够新增菜单的原因是前端脚手架与renren-fast后端脚手架通信&…

全面理解BDD(行为驱动开发):转变思维方式,提升软件质量

在传统的软件开发流程中&#xff0c;开发人员和测试人员的工作通常是相互独立的。开发人员负责编写代码&#xff0c;测试人员负责找出代码中的问题。然而&#xff0c;这种方法可能导致沟通不足&#xff0c;而且会浪费时间和资源。为了解决这些问题&#xff0c;出现了一种新的开…

Mask2former代码详解

1.整体流程 Mask2former流程如图所示&#xff0c;对于输入图片&#xff0c;首先经过Resnet等骨干网络获得多层级特征&#xff0c;对于获得的多层级特征&#xff0c;一个方向经过pixel decoder(基于DetrTransformerEncoderLayer)得到per-pixel embedding,另外一个方向经过transf…

matlab的imclose()详解

J imclose(I,SE) J imclose(I,nhood) 说明 J imclose(I,SE) 使用结构元素 SE 对灰度或二值图像 I 执行形态学闭运算。形态学闭运算是先膨胀后腐蚀&#xff0c;这两种运算使用相同的结构元素。 J imclose(I,nhood) 对图像 I 执行闭运算&#xff0c;其中 nhood 是由指定结…

mac监听 linux服务器性能可视化(Grafana+Promethus+Node_exporter)

Grafana和promethus(普罗米修斯)的安装和使用 监控系统的Prometheus类似于一个注册中心&#xff0c;我们可以只需要配置一个Prometheus,而在其他服务器&#xff0c;只需要安装node_exporter,它们的数据流转就是通过exporter采集数据信息&#xff0c;然后告诉prometheus它的位置…

分布式链路追踪 Zipkin+Sleuth(8)

项目的源码地址 Spring Cloud Alibaba 工程搭建&#xff08;1&#xff09; Spring Cloud Alibaba 工程搭建连接数据库&#xff08;2&#xff09; Spring Cloud Alibaba 集成 nacos 以及整合 Ribbon 与 Feign 实现负载调用&#xff08;3&#xff09; Spring Cloud Alibaba Ribbo…

CUDA专项

1、讲讲shared memory bank conflict的发生场景&#xff1f;以及你能想到哪些解决方案&#xff1f; CUDA中的共享内存&#xff08;Shared Memory&#xff09;是GPU上的一种快速内存&#xff0c;通常用于在CUDA线程&#xff08;Thread&#xff09;之间共享数据。然而&#xff0…