问题描述:一个Icon点击出现菜单,点击菜单区域外任何区域菜单收起。何为优雅的去解决
问题描述:
一个Icon点击出现菜单,点击菜单区域外任何区域菜单收起。 何为优雅的去解决上述问题?
- 尽可能的采用vue来解决问题
- 尽可能少的与原生对象发生交互
- 代码干净、易懂
问题解决思路:
- 通过Vue的v-show指令决定菜单的显示、隐藏。
- 通过Document的全局点击事件判断是否该收起
- 需要优雅的解决几个问题:
- 禁止点击事件冒泡。采用VUE的@click.stop来解决问题,请参考下方代码
- 优雅且安全的移除全局事件监听(只有菜单弹出的时候才去监听)
document的事件添加
HTML
<template>
<div class="dir">
<!-- 按钮,特别注意@click.stop用于禁止消息冒泡 -->
<span title="排序" id="sort_by" @click.stop="onSortClick()" class="icons">按钮</span><br/>
<!-- 菜单 v-show设置变量 showSortmenu,style的内容要一开始就写上!
此处不确定是否是个BUG,不初始style时显示不正确
-->
<ul class="menu" id="sort_by_menu" v-show="showSortmenu" style="display: block;">
<li sort="title">
<span>标题</span>
</li>
<li sort="lastModify">
<span>最后修改时间</span>
</li>
<li sort="free">
<span>自定义排序</span>
</li>
</ul>
</div>
</template>
JavaScript
<script>
export default {
name: "demo2",
data() {
return {
showSortmenu: false
};
},
props: {},
methods: {
//接收按钮点击事件@click.stop,禁止冒泡
onSortClick: function() {
//设置bool值,
this.showSortmenu = !this.showSortmenu;
//要特别注意这里,只有菜单显示的时候才会监听全局点击事件
//并且,要设置为:vue的方法,不能扔到export代码段外面去。
//要切记`this`这个变量对应的实例是谁
if (this.showSortmenu) {
document.addEventListener("click", this.onGlobalClick);
}
},
//全局监听点击事件
onGlobalClick(e) {
//判断全局被点中的控件的className,不同就是菜单外点击
if (e.target.className != "sort_by_menu") {
this.showSortmenu = false;
//这里要注意啊!!!!一定要记得移除监听事件!!!!!
document.removeEventListener("click", this.onGlobalClick);
}
}
},
mounted() {},
};
</script>
总结
以上所述是小编给大家介绍的Vue 实现显示/隐藏层的思路(加全局点击事件),希望对大家有所帮助!
vue 显示 隐藏层 vue 全局点击事件