element-ui 多选框和级联选择的部分bug以及解决方法

news2024/12/26 23:35:09

前言

最近在开发一款使用了 element-ui 的低代码设计器,在开发的过程当中碰到了一些关于 element-ui 组件本身不合理的地方,并且在百度的基础上自己去阅读了一下 element-ui 的源码,也找出了这些问题的一个解决方案,下面就来看一下问题所在以及解决方法。

多选框的min设定为超过1就无法选中第一项

问题

组件本身存在一点问题,一旦min的值大于当前选中的选项超过2的时候,比方说,预选中的选项有一个,但是min的值设定为3,那么就会出现,我无论怎么点,都不会有反应。

这个问题在官方给出的在线运行例子中也是会出现的,感兴趣的可以去官网看一下:

element.eleme.io/#/zh-CN/com…

这个设计也不能说有问题,但是在实际的使用中就会有点奇怪,比方说一个3个的多选框,要求最少填写2个,那么你第1个永远都勾不上,并且这个问题好像在 vue3 版本的 elm 组件中已经得到解决。

原因

断点调试以及仔细阅读了选择之后的源码,会发现是一段代码在阻止这个选中状态

这段代码,仔细阅读就会发现,当我重新set整个的值的时候,这里会去计算 isLimitExceeded 这个值,当设置了 min 最小值,并且当前选中的选项的个数要小于min的话,就会导致 isLimitExceeded = true 并且在下面的 handleChange 这个函数中,一旦这个值为 true 就会直接返回

这样就导致了,万一我有四个多选框,最小要选择两个,但是我一进来的时候是 0 的预选值,那么无论我怎么点,都不会产生反应,因为每次一点下去触发 set 方法,isLimitExceeded 会被 判定为 true ,那么下面更改值的 handleChange 函数就一直不会触发,所以会导致这个问题。

解决方法

目前我使用的解决方法就是将源码中这个组件单独拷贝出来自己维护,比方说

而引用的这个组件的内容就是和官方的完全相同,因为组件都是全局注册的,所以就不会存在这个我们自己定义的组件会发生报错。

这样之后就可以解决这个问题了

级联选择删除过后不会清空选项

问题

还是一样参考官网的例子,想要自己尝试的可以一边看一边移步官网的源码

element.eleme.io/#/zh-CN/com…

clearable 这个能否清空的属性,会在选项后面新增一个移入后展示的 icon

但是点击之后就会发现,虽然输入框里面的值是被清空了,但是并不会删除选框内的内容

这里可以看到,清空了之后,选框还是展开的状态

原因

之前有使用过 vant,在 vant 当中,级联选择并不是一个单独的组件,而是使用

它是由三个组件组合而成,一个输入框,用于回显,一个弹出层,用于承载选项,一个选项组件,用于给用户选择。

那么就能够大概感觉到,饿了么的清除功能,可能只是简单的清除了 input 内的内容。

那么接下来让我们移步源码,看看那个点击事件做了什么

从页面的元素展示以及代码,我们就能够看出来,饿了么的组件也是和 vant 一样的三段式,由 input 弹窗 弹窗内容 三个组成,那么我们接下去找到清空按钮的方法,通过元素选择找到删除按钮的 icon 名称,再去代码中查找

很容易就能够找到这个方法,再看一下方法的实现

清空了 input 绑定的 value 值,并且调用了 弹出内容层 的一个方法,这个 panel 就是利用 ref 找到了 弹出内容的对象,只不过加了一层,那么重点就在于调用的这个方法 clearCheckedNodes

从文件夹中找到 cascader-panel 这个组件所在。

看到我们想要的那个方法

这个方法的执行取决于我们传入给 级联组件 的配置,但是最后的本意都是要去清除掉选中的值, 也就是 chechedValue = []

可以看到清空之后这个值确实被清空了,也就是最后一项的选中的那个值,这也就是为什么没有初始化下拉框,因为它做的就只有这么多而已,想要初始化下拉框的话,还是得靠我们自己去查找。、

解决方法

我们想要的是整个选项都进行初始化,所以继续查找这个选项是什么参数控制的

根据高亮的类名,我们可以一路找到

cascader-panel 引用 cascader-menucascader-menu 引用 cascader-node 最后在 cascader-node 当中

inActivePath 这个属性决定了是否加上 ‘in-active-path’ 这个类,也就对应了是否高亮

那么去找这个属性的赋值,就能够发现

这个属性是根据 最外面的 cascader-panel 组件上的 activePath 这个属性。

那么就又回到了我们最外面的 cascader-panel 组件

我们可以在清空后的回调事件中,尝试着利用 $refs 清空 activePath 这个数组

this.$refs.myCascader.$refs.panel.activePath = []; // 清除高亮 

然后我们就会发现,虽然高亮被清空了,但是还是处于展开状态,到这里就解决完一半

那么就还需要还原组件的展开状态

根据 cascader-panel 组件 和 浏览器中看到的元素,我们就能够比较直观的看出来,这个层级的展开取决于 menus 这个数组的个数,并且在搜索这个 menus 是如何生成的时候,能够发现

menus 将会这样被初始化,那么,我们的第一种解决方法也就出来了

 handleChange(data){
      if(data && data.length == 0) {
        this.$refs.myCascader.$refs.panel.activePath = []; // 清除高亮
        this.$refs.myCascader.$refs.panel.menus = [this.$refs.myCascader.$refs.panel.store.getNodes()]; // 初始化(只展示一级节点)
      }
    } 

我们可以在 change 事件中去清空 activePath 的值,这样就会使得全部的联机下拉内容都消失,然后再去重新初始化一级节点。

或者直接调用 syncActivePath 这个方法,

这个方法在 activePathcheckedValue 都为空的时候,也会执行我们上面的那段逻辑,结局是一样的,并且在执行这个方法前,我们已经把 activePath 手动设为空了,checkedValue 也在前面说过,组件上层的点击方法会把它清空,也就是一定会走最下面的 else 逻辑

又或者直接执行 syncCheckedValue 这个函数,

这个函数会去判断当前选中的值和级联中的值是否相等,由于选中的值在点击事件中已经被清空了,所以一定是不相等的,就会重新初始化级联选择,也能够达到重置的目的。

那么到这里就解决了这个组件初始化的问题,具体要使用哪种方法,就看个人自己决定。

总结

本文简单的总结了一下最近开发中碰到的两个饿了么组件相关问题,可能算不上bug,设计之初可能就是这样,但是根据需求的需要,自己对其进行了一些调整以及研究为什么要这样调整,有更多的见解欢迎讨论

最后

为大家准备了一个前端资料包。包含54本,2.57G的前端相关电子书,《前端面试宝典(附答案和解析)》,难点、重点知识视频教程(全套)。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

steam搬砖是什么?怎么做呀?

steam平台是什么?它是国外一个集全球大部分网游于一体的游戏平台,玩过绝地求生端游(吃鸡),csgo的朋友,对它都不陌生,就像国内的Wegame一样,现在玩英雄联盟的,都是通过Weg…

排序算法之冒泡算法

目录 排序算法介绍 冒泡排序 算法流程 算法实现 python C 排序算法介绍 《Hello算法》是GitHub上一个开源书籍,对新手友好,有大量的动态图,很适合算法初学者自主学习入门。而我则是正式学习算法,以这本书为参考&#xff0c…

返回数组所有元素中或每行(列)中,最小值的位置(位置号从0开始):argmin()函数

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 返回数组所有元素中或每行(列)中 最小值的位置(位置号从0开始) argmin()函数 选择题 下列说法错误的是? import numpy as np a np.array([[10,20,30,40],[15,20,25…

Electron 企业级应用开发实战(二)

这一讲会重点介绍如何集成 Node.js、使用 preload 脚本、进程间双向通信、上下文隔离等,为大家揭开 Electron 更强大的能力。 集成 Node.js 企业级桌面应用的资源都是本地化的,离线也能使用,所以需要把 html、js、css 这些资源都打包进去&a…

独立光伏-电池-柴油发电机组的能源管理系统的主干网研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

ESPI3接收机

18320918653 ESPI3 ESPI3|R&S ESPI3|二手EMI接收机|EMI预认证测试接收机|罗德与施瓦茨|EMC接收机|9KHz至3GHz品 牌:德国罗德与施瓦茨 | R&S | Rohde&Schwarz处于预认证级别的 R&S ESPI测试接收机有两种型号, 集成了罗德与施瓦茨公司认证级EMI测试…

springboot:除了OpenOffice还可以用它轻松实现文档在线预览功能【附带源码】

0. 引言 我们在项目中常常需要实现文档在线预览的功能,而文档种类繁多,除了pdf,还有word、text、excel、甚至还有mp3,mp4等多媒体文件。常用的手段是通过OpenOffice来将文档转换为pdf实现预览,本期我们就来看如何通过kkFileView实…

rabbitmq基础10——消息追踪、Shovel插件的web端使用和命令使用

文章目录一、消息追踪1.1 Firehose功能1.1.1 开启与关闭1.1.2 测试1.1.3 总结1.2 rabbitmq_tracing 插件1.2.1 定义trace规则1.2.2 测试1.2.2.1 与Firehose之间的优先级二、Shovel插件2.1 实现原理2.1.1 从队列到交换器2.1.2 从队列到队列2.1.3 交换器到交换器2.2 Shovel 插件使…

大小端转换

一、名词解释首先解释一下大端模式和小端模式。小端模式,也叫小端存储:Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。大端模式,也叫大端存储:Big-Endian就是高位字节排放在内存的低地…

2022年度技术总结

2022 年度总结 本年收获 计算机网络 2022年2月,系统学习巩固了计算机网络课程(本科),基本的七层模式,四层模式,重点是与前端开发相关的 TCP UDP HTTP HTTPS 等协议。 现在有一个整体的认识:…

@Transactional事务处理解决方案的看法

Transactional事务处理解决方案的看法前言一.声明式事务二.编程式事务三.事务粒度优化方法四.缓存和事务的一致性五.介绍--延时双删总结前言 提示:这里可以添加本文要记录的大概内容: 本文就是了解一下声明式事务和编程式事务的优缺点和事务一致性的一…

怎样阅读NLP论文

经典的论文也是需要读的。并不是所有的论文都值得细读。论文不是从头赶着朝下读。 目录收集和组织论文收集组织1.通过会议的方式分类2.是否是arXiv上的文章分类(preprint or not)3.根据问题(推荐),方法和数据集分类选择…

Ka波段卫星通信小尺寸无线电设计

传统Ka波段地面站卫星通信系统依赖于室内到室外配置。室外单元包含天线和块下变频接收机,接收机输出L波段的模拟信号。该信号随后被传送到室内单元,室内单元包含滤波、数字化和处理系统。Ka波段的干扰信号通常较少,因此室外单元的主要任务是以…

微信小程序开发整体过程整理

目录1微信开发相关介绍1.1微信公众平台1.2微信开放平台1.3注意事项2微信小程序开发整体介绍2.1微信小程序简介2.2小程序接入流程3框架简介3.1uni-app简介3.2学习使用uni-app3.3学习微信小程序开发4开发规范5开发示例5.1开发工具5.2开发调试5.2.1导入代码5.2.2项目运行5.2.3在微…

第三篇 - 对象的单层劫持

一,前言 上篇,介绍了 Vue 使用及数据初始化的流程 回顾一下,主要涉及以下几个核心点: initMixin 方法: 原型方法 Vue.prototype._initvm.$options:使 options 选项在 vm 实例上被共享initState 方法&…

c#入门-匿名函数,多播委托

匿名函数 如果一个函数的参数是一个委托类型。而你此刻没有合适的方法组使用&#xff0c;也不想为他专门声明一个局部函数。 则可以使用匿名函数。匿名函数的创建更为简单&#xff0c;语法为&#xff1a;返回类型 参数列表 > 函数主体 Func<int, string> func str…

人工智能OCR文字识别研究

1 研究背景 人工智能是研究开发能够模拟、延伸和扩展人类智能的理论、方法、技术及应用系统的一门新的技术科学&#xff0c;研究目的是促使智能机器会听&#xff08;语音识别、机器翻译等&#xff09;、会看&#xff08;图像识别、文字识别等&#xff09;、会说&#xff08;语音…

使用Jiralert实现AlertManager告警对接Jira

简介 Alertmanager 处理由客户端应用程序&#xff08;如 Prometheus server&#xff09;发送的警报。它负责去重(deduplicating)&#xff0c;分组(grouping)&#xff0c;并将它们路由(routing)到正确的接收器(receiver)集成&#xff0c;如电子邮件&#xff0c;微信&#xff0c…

MMYOLO 自定义数据集从标注到部署保姆级教程

theme: juejin 来自社区 PeterH0323 投稿 AI 已经被应用到各行各业&#xff0c;现如今任何人都可以轻松基于开源框架快速搭建符合自身需求的 AI 应用。本文将基于 MMYOLO 开源框架&#xff0c;基于生活中收集的猫猫数据集&#xff0c;教你如何从零开始训练一个可部署检测模型…

TiCDC 源码阅读(二)TiKV CDC 模块介绍

内容概要 TiCDC 是一款 TiDB 增量数据同步工具&#xff0c;通过拉取上游 TiKV 的数据变更日志&#xff0c;TiCDC 可以将数据解析为有序的行级变更数据输出到下游。 本文是 TiCDC 源码解读的第二篇&#xff0c;将于大家介绍 TiCDC 的重要组成部分&#xff0c;TiKV 中的 CDC 模…