为element-ui 打个补丁修复el-form的label width问题

为element-ui 打个补丁修复el-form的label width问题

问题回顾

用 element-ui 遇到一个奇怪的问题,控制台老是抛错

[Vue warn]: Error in beforeDestroy hook: "Error: (ElementForm]unpected width

最终排查下来是 el-form 设置了 label-width="auto" 然后又处于不展示的情况下(display: none,项目里是 el-tab产生的)在离开页面的时候就会有问题。

el-form 在挂载时(display:none也会挂载),会初始化一个 el-label 的 width 的数组,在销毁的时候时候会依次清除 该数组 。问题原因在此获取宽度函数上

// https://github.com/ElemeFE/element/blob/dev/packages/form/src/label-wrap.vue#L32
methods: {getLabelWidth: function getLabelWidth() {if (this.$el && this.$el.firstElementChild) {var computedWidth = window.getComputedStyle(this.$el.firstElementChild).width;// return computedWidth == 'auto' ? 'auto' : Math.ceil(parseFloat(computedWidth));return Math.ceil(parseFloat(computedWidth));} else {return 0;}},//...
}

在注册的时候取宽度(getLabelWidth)会拿到 NaN,因为 getComputedStyle 在元素未实际渲染时(父元素display:none)会取到 auto, parseFloat('auto') 就会NaN,不会被注册到 数组 potentialLabelWidthArr

// https://github.com/ElemeFE/element/blob/dev/packages/form/src/form.vue#L168
registerLabelWidth(val, oldVal) {if (val && oldVal) {const index = this.getLabelWidthIndex(oldVal);this.potentialLabelWidthArr.splice(index, 1, val);} else if (val) {this.potentialLabelWidthArr.push(val);}
}

在销毁的时候自然取不到 就抛错了 [ElementForm]unpected width

// https://github.com/ElemeFE/element/blob/dev/packages/form/src/form.vue#L160
getLabelWidthIndex(width) {const index = this.potentialLabelWidthArr.indexOf(width);// it's impossibleif (index === -1) {throw new Error('[ElementForm]unpected width ', width);}return index;
},

原因找到了,更改也比较简单, getLabelWidth 函数中 针对auto做个处理

// lib/element-ui.common.js
getLabelWidth: function getLabelWidth() {if (this.$el && this.$el.firstElementChild) {var computedWidth = window.getComputedStyle(this.$el.firstElementChild).width;return computedWidth == 'auto' ? 'auto' : Math.ceil(parseFloat(computedWidth));// return Math.ceil(parseFloat(computedWidth));} else {return 0;}},

想在项目中应用该更新,可以为该项目提个pr,不过现在700+issue, 而且合并太慢了;还有方式就给element-ui弄到本地,改了代码打包本地引用。patch就有点像第二种方式,提供命令而不是去操作文件为你的依赖包应用上自己的更新。

patch

pnpm

pnpm 自定义支持 patch 命令

pnpm patch <package@version>
# 此时应该给你源码copy出来一份了,接着打开它提示的文件更改源码(zsh 支持 open打开),然后提交
# 需要注意的是要改对文件!!(本次我改的是 lib/element-ui.common.js),结合错误抛出位置和 package.json 的 main
pnpm patch-commit <path>

实际场景:

➜  vue2_65 git:(main)pnpm patch element-ui@2.15.14
You can now edit the following folder: /private/var/folders/sb/hl7wb2_s1mg2_6ncfs8zwl1c0000gn/T/adaf3ade4d5d95518a629b519ce2f5efOnce you're done with your changes, run "pnpm patch-commit /private/var/folders/sb/hl7wb2_s1mg2_6ncfs8zwl1c0000gn/T/adaf3ade4d5d95518a629b519ce2f5ef"
➜  vue2_65 git:(main)open /private/var/folders/sb/hl7wb2_s1mg2_6ncfs8zwl1c0000gn/T/adaf3ade4d5d95518a629b519ce2f5ef
➜  vue2_65 git:(main)pnpm patch-commit /private/var/folders/sb/hl7wb2_s1mg2_6ncfs8zwl1c0000gn/T/adaf3ade4d5d95518a629b519ce2f5efWARN  deprecated vue@2.7.16: Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.WARN  8 deprecated subdependencies found: abab@2.0.6, core-js@2.6.12, domexception@4.0.0, glob@7.2.3, inflight@1.0.6, rimraf@2.7.1, rimraf@3.0.2, sourcemap-codec@1.4.8
Packages: -1
-
Progress: resolved 496, reused 476, downloaded 0, added 1, done

yarn

yarn 2 也支持patch(https://yarnpkg.com/cli/patch)

1.x 的话需要 安装 patch-packagepostinstall-postinstall

yarn add -S patch-package postinstall-postinstall

package.json 配置

"scripts": {"postinstall": "patch-package"},

接着更改源码 注意查看 依赖包的入口文件,确保改对文件

# 保存之后就打补丁,不要加版本号,不支持
yarn patch-package element-ui

建议重新装一遍依赖,后面每次装依赖都会有提示patches

...
success Saved lockfile.
$ patch-package
patch-package 8.0.0
Applying patches...
element-ui@2.15.14 ✔
✨  Done in 12.03s.

最后

打完补丁后都会产生 /patches 文件,pnpm 打完补丁还会再package.json下产生

"pnpm": {"patchedDependencies": {"element-ui@2.15.14": "patches/element-ui@2.15.14.patch"}}

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

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

相关文章

Python实践项目 - 猜数字

实践项目 为了巩固所学知识并培养实践能力&#xff0c;我们可以设计一些有趣的实践项目。以下是一个简单的实践项目示例&#xff1a; 猜数字游戏 项目描述&#xff1a;编写一个猜数字游戏&#xff0c;程序随机生成一个1到100之间的整数&#xff0c;让玩家输入猜测的数字。如…

计算机进入安全模式

最近老是蓝屏------显示是REGISTRY_ERROR&#xff08;注册表错误&#xff09; 重启之后选择进入安全模式 我重启之后&#xff0c;按F8进不了安全模式。通过另一种方式进入&#xff0c;按住Shift键再按重启 重启之后出现以下界面 选择疑难解答&#xff0c;再选择高级选项 在高…

pandas保存成CSV格式时数据换行:SQL的REPLACE函数过滤掉数据的回车符

在使用Pandas保存数据到CSV文件时&#xff0c;如果数据中包含换行符&#xff08;例如\n&#xff09;&#xff0c;这可能会导致数据在CSV文件中被分割成多行&#xff0c;影响数据的完整性和可读性。为了解决这个问题&#xff0c;你可以在保存CSV之前使用Pandas的replace函数来替…

【华为OD机试】日志限流(C++/Java/Python)

题目 题目描述 某软件系统会在运行过程中持续产生日志,系统每天运行N单位时间,运行期间每单位时间产生的日志条数保行在数组records中。records[i]表示第i单位时间内产生日志条数。 由于系统磁盘空间限制,每天可记录保存的日志总数上限为total条。 如果一天产生的日志总条数…

vue3 axios封装接口请求 useAxiosWithCancel hook

实际项目需求&#xff0c;类似机器人对话。生成对话过程中有个停止生成。点击停止生成中断请求。axios提供两种方法 1 .使用 AbortController2CancelToken 取消请求机制说明&#xff1a; 从 v0.22.0 开始&#xff0c;Axios 支持以 fetch API 方式—— AbortController 取消请求…

20240623日志:大模型压缩-sliceGPT

context 1. 剪枝方案图释2. 正交矩阵Q 1. 剪枝方案图释 Fig. 1.1 剪枝方案 图中的阴影是表示丢弃掉这部分数据。通过引入正交矩阵 Q Q Q使 Q ⊤ Q Q Q ⊤ I \mathrm{Q}^\top\mathrm{Q}\mathrm{Q}\mathrm{Q}^\top\mathrm{I} Q⊤QQQ⊤I&#xff0c;来大量缩减 X X X的列数和 W …

androidx.preference框架介绍

一,概要 Preference作为setting核心框架,笔者对此框架做一个简单的解析,androidx.preference本质是对设置领域提供了一层View封装,以android view本身的策略模式进行二次开发,将常用的一些设置样式封装到不同的Preference中,以达到快速开发设置相关功能。并且,此风格与…

将 MinIO 与 Keycloak OIDC 集成

Keycloak是一种单点登录解决方案。使用Keycloak&#xff0c;用户使用Keycloak而不是MinIO进行身份验证。如果没有Keycloak&#xff0c;您将不得不为每个用户创建一个单独的身份 - 从长远来看&#xff0c;这将很麻烦。您需要一个集中身份解决方案来管理 MinIO 的身份验证和授权。…

OpenHarmony 5.0 纯血鸿蒙系统

OpenHarmony-v5.0-Beta1 版本已于 2024-06-20 发布。 OpenHarmony 5.0 Beta1 版本标准系统能力持续完善&#xff0c;ArkUI 完善了组件通过 C API 调用的能力&#xff1b;应用框架细化了生命周期管理能力&#xff0c;完善了应用拉起、跳转的能力&#xff1b;分布式软总线连接能力…

每日一练 - IGMP Snooping工作机制详解

01 真题题目 关于 IGMP Snooping 工作机制的描述,正确的是? A.如果主机发出的 IGMP 离开报文时,交换机将该主机加入到相应的组播表中 B.如主机发出的 IGMP 主机撒告文时交换机将翻除与读主机对的组播表项 C.二层交换机通过不断听 IGMP 报文在二层建立和维护 MAC 广播地址表…

【面试题】漏洞复现的步骤

漏洞复现是信息安全工作中非常重要的一个环节&#xff0c;它通过对已发现的漏洞进行模拟攻击&#xff0c;来验证漏洞的存在性并深入理解其影响。以下是漏洞复现的主要步骤&#xff0c;并尽量以分点表示和归纳的形式呈现&#xff1a; 1. 收集漏洞信息 从漏洞公告、CVE&#xf…

laravel 使用RabbitMQ作为消息中间件

先搞定环境&#xff0c;安装amqp扩展 确保已安装rabbitmq-c-dev。 比如 可以使用apk add rabbmit-c-dev安装 cd ~ wget http://pecl.php.net/get/amqp-1.10.2.tgz tar -zxf amqp-1.10.2.tgz cd amqp-1.10.2 phpize ./configure make && make install cd ~ rm -rf am…

vuex的深入学习[基于vuex3]----篇(三)

vuex的深入学习[基于vuex3]----篇(三) 这篇美团的博客非常好。直接看就行 https://tech.meituan.com/2017/04/27/vuex-code-analysis.html

Vue2中的render函数

Vue 推荐在绝大多数情况下使用模板来创建你的 HTML。然而在一些场景中&#xff0c;你真的需要 JavaScript 的完全编程的能力。这时你可以用render渲染函数&#xff0c;它比模板更接近编译器 。 在Vue2中&#xff0c;render函数是一个可选的、用于生成虚拟DOM的特殊函数。它是Vu…

2024年最新【交安】公路水运安全员备考题库。

46.(  )负责建筑施工企业安全生产许可证的颁发和管理&#xff0c;并接受国务院建设主管部门的指导和监督。 A.国务院建设主管部门 B.国务院安全生产监督管理部门 C.省、自治区、直辖市人民政府建设主管部门 D.省、自治区、直辖市人民政府安全生产监督管理部门 答案&…

变量在PHP中是如何使用的?

在PHP中&#xff0c;变量是用于存储数据的容器&#xff0c;可以存放各种类型的数据&#xff0c;如数字、文本字符串、布尔值等。PHP是一种弱类型语言&#xff0c;这意味着在使用变量时不需要事先声明其类型&#xff0c;PHP会根据变量的值自动将其转换为正确的数据类型。 定义变…

国际网络专线怎么开通?

在全球化日益加速的今天&#xff0c;企业越来越需要稳定、高效的网络来支撑他们的跨国业务。国际网络专线&#xff0c;作为外贸企业、出海企业等拓展全球业务的关键基础设施&#xff0c;其重要性不言而喻。那么&#xff0c;企业如何才能开通国际网络专线呢&#xff1f;本文将详…

Amazon Q Developer 实战:从新代码生成到遗留代码优化(下)

简述 本文是使用 Amazon Q Developer 探索如何在 Visual Studio Code 集成编程环境&#xff08;IDE&#xff09;&#xff0c;从新代码生成到遗留代码优化的续集。在上一篇博客《Amazon Q Developer 实战&#xff1a;从新代码生成到遗留代码优化&#xff08;上&#xff09;》中…

深度学习初探:一场迷人的AI之旅

嘿&#xff0c;小伙伴们&#xff01;今天咱们来聊聊一个超级酷的话题——深度学习。虽然听起来有点高大上&#xff0c;但其实它也没那么神秘。接下来我们一起轻松入门&#xff0c;揭开深度学习的面纱。 1. 深度学习概述 首先&#xff0c;什么是深度学习呢&#xff1f;简单来说&…

docker常见问题-持续更新

docker 启动的问题解决 解决: 下载更新linux的win子系统, 重启就可以 WSL 2 installation is incomplete. 更加报错提示,猜测可能是我们使用的wsl2版本老了,需要我们自己手动更新一下,我们根据提示去微软官网下载最新版的wsl2安装后即可正常打开。更新包下载链接。 https://ws…