问题
在项目页面中使用 element popover,设置trigger='click'时点击外部不会触发自动隐藏,但在 element 官网中是可以正常触发的(官方示例),项目中的菜单是自定义写的,所以怀疑是有黑魔法。
查找原因
window.addEventListener('click', () => console.log('window click===>>>>'))
,发现只有菜单栏外层能够触发。,这里的 click 事件使用了 stop 修饰符(阻止冒泡),可能阻止了 popover 外部点击的事件判断,尝试将 stop 修饰符去掉,发现外部点击事件正常触发。
确认代码修改没有副作用
在修复 bug 时,需要注意不会产生额外的 bug,那就需要了解修改的这段代码的含义
@click.stop="isShowWhole = false"
从代码上看,点击 class 为 main 的 div 将会触发左边侧边栏缩略显示,加上 stop 修饰符是为了防止事件冒泡,所以能否去掉 stop 需要确认是否有这个必要。
// router.js
let routes = [
{
path: '/',
alias: '/admin',
component: Menu,
children: [...Pages],
},
{
path: '*',
name: '404',
component: NotFound,
},
];
在路由中可以看到,Menu 是作为根路由进行渲染,除了 404 页面都是它的子路由,所以 stop 修饰符是没有必要加上的,去除后经过测试没有其他影响。
深入 element popover 源码分析原因
对 element 组件进行 debug 时,可以直接引入相关组件的源码
import ElPopover from 'element-ui/packages/popover';
export default {
components: {
CheckboxFilter,
ElPopover
},
...
}
然后我们就可以在node_modules的 element 源码进行 debug 操作(危险步骤,debug 后需要复原)。
// node_modules/element-ui/packages/popover/src/main.vue
mounted() {
...
if (this.trigger === 'click') {
on(reference, 'click', this.doToggle);
on(document, 'click', this.handleDocumentClick);
} else if (this.trigger === 'hover') {
...
} else if (this.trigger === 'focus') {
...
}
}
popover 在 mounted 钩子内初始化了trigger='click'
的事件绑定,on(document, 'click', this.handleDocumentClick)
这里绑定了 document 很可能就是阻止事件冒泡后不能触发外部点击隐藏的判断逻辑。
// node_modules/element-ui/packages/popover/src/main.vue
handleDocumentClick(e) {
let reference = this.reference || this.$refs.reference;
const popper = this.popper || this.$refs.popper;
if (!reference && this.$slots.reference && this.$slots.reference[0]) {
reference = this.referenceElm = this.$slots.reference[0].elm;
}
if (!this.$el ||
!reference ||
this.$el.contains(e.target) ||
reference.contains(e.target) ||
!popper ||
popper.contains(e.target)) return;
this.showPopper = false;
},
这里判断this.$el是否包含 click 的 target,从而是否触发this.showPopper = false,当菜单栏阻止事件冒泡后 document 不能监听到 click 事件,才会无法进行外部点击隐藏的判断逻辑。
延伸v-clickoutside
element 的 select 组件中用到了 v-clickoutside 自定义指令,作用和 popover 的 handleDocumentClick 差不多(倒不如说 handleDocumentClick 是特殊的 clickoutside)
在上面的问题中,我们单独把 v-clickoutside 抽出来使用确实可以的,这是为什么呢?
// node_modules/element-ui/packages/popover/src/utils/clickoutside.js
!Vue.prototype.$isServer && on(document, 'mousedown', e => (startClick = e));
!Vue.prototype.$isServer && on(document, 'mouseup', e => {
nodeList.forEach(node => node[ctx].documentHandler(e, startClick));
});
答案是 v-clickoutside 使用鼠标事件判断的,所以 click 的 阻止冒泡不会让 clickoutside 无效。
总结
解决 bug 的过程中需要做到不产生额外的 bug,并且深入分析问题的原因有助于能力的提高。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
写下你的评论吧 !
推荐阅读
-
本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ...
[详细]
蜡笔小新 2024-12-26 13:30:37
-
moment 国际化设置中文语言 (全局) 及使用示例 ...
[详细]
蜡笔小新 2024-12-26 10:38:30
-
-
本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ...
[详细]
蜡笔小新 2024-12-21 14:45:11
-
Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ...
[详细]
蜡笔小新 2024-12-21 12:39:07
-
本文将详细介绍如何在没有显示器的情况下,使用Raspberry Pi Imager为树莓派4B安装操作系统,并进行基本配置,包括设置SSH、WiFi连接以及更新软件源。 ...
[详细]
蜡笔小新 2024-12-21 08:14:50
-
本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ...
[详细]
蜡笔小新 2024-12-19 21:07:12
-
本文详细介绍如何通过设置SSH密钥来获取连接GitHub远程仓库的权限,包括生成密钥、添加到GitHub账户以及验证连接等步骤。 ...
[详细]
蜡笔小新 2024-12-19 19:02:13
-
本文介绍如何配置SecureCRT以正确显示Linux终端的颜色,并解决中文显示问题。通过简单的步骤设置,可以显著提升使用体验。 ...
[详细]
蜡笔小新 2024-12-19 18:30:14
-
最新计算机专业原创毕业设计参考选题都有源码+数据库是近期作品ling取参考你的选题刚好在下面有,有时间看到机会给您发1ssm资源循环利用2springboot校园考勤系统3ssm防 ...
[详细]
蜡笔小新 2024-12-19 11:39:56
-
本文介绍如何在 CentOS 7.2 系统上配置防火墙以开放特定的服务端口,包括 FTP 服务的临时与永久开放方法,以及如何验证配置是否生效。 ...
[详细]
蜡笔小新 2024-12-18 20:58:47
-
本指南详细介绍了如何在同一台计算机上配置多个GitHub账户,并使用不同的SSH密钥进行身份验证,确保每个账户的安全性和独立性。 ...
[详细]
蜡笔小新 2024-12-18 10:54:08
-
本文详细介绍了一款名为WinSCP的开源图形化SFTP客户端,该工具支持SSH协议,适用于Windows操作系统,能够实现与Linux系统之间的文件传输。对于从事嵌入式开发的技术人员来说,掌握WinSCP的使用方法将极大提高工作效率。 ...
[详细]
蜡笔小新 2024-12-18 09:58:05
-
本文探讨了一种常见的网络配置问题及其解决方案,即如何在外网环境下安全地访问位于局域网内的计算机。特别介绍了使用SSH反向隧道技术来实现这一目标的具体步骤和注意事项。 ...
[详细]
蜡笔小新 2024-12-18 09:02:41
-
本文详细介绍了如何在Linux系统上搭建Web服务器的过程,包括安装Apache、PHP和MySQL等关键组件,以及遇到的一些常见问题及其解决方案。 ...
[详细]
蜡笔小新 2024-12-17 19:02:43
-
先进的山楂4l4_519
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
-
1Vuforia 开发指南:第二章 环境配置与搭建
-
2DevExpress v17.2新版本亮点深入解析:CodeRush功能详解(下篇)
-
3实现Android中TextView的垂直滚动功能
-
4FreeBSD环境下PHP GD库安装问题的详细解决方案
-
5Java中初始代码块、实例变量与构造器的初始化顺序详解
-
6多个DHCP服务器的作用域及其备份方案(上篇)
-
7艾伟深入解析:WCF Binding模型中的绑定元素详解
-
8Lumen 中间件深入解析与应用指南
-
9显卡选择时需要考虑与CPU和主板的兼容性吗?
-
10如何在点击 UITabBarController 的某个标签时以模态方式呈现一个新的 ViewController?
-
11序章二:他患有严重的强迫症(细节控)
-
12Bootstrap 学习指南:全面掌握前端框架的核心知识点与实战技巧
-
13ABP 前端开发中组件间参数传递的多种方法与实践
-
14全面覆盖的前端开发面试题集锦(附详尽解答)
-
15C#中枚举的应用与实践
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有