Vue 实现显示/隐藏层的思路(加全局点击事件)


Posted in Javascript onDecember 31, 2019

问题描述:

一个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 实现显示/隐藏层的思路(加全局点击事件),希望对大家有所帮助!

Javascript 相关文章推荐
javascript 操作Word和Excel的实现代码
Oct 26 Javascript
Jquery 常用方法经典总结
Jan 28 Javascript
JQuery UI DatePicker中z-index默认为1的解决办法
Sep 28 Javascript
jquery绑定原理 简单解析与实现代码分享
Sep 06 Javascript
解析Jquery中如何把一段html代码动态写入到DIV中(实例说明)
Jul 09 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
Jan 12 Javascript
jQuery中设置form表单中action值的实现方法
May 25 Javascript
javascript函数的四种调用模式
Jan 08 Javascript
node.js文件上传重命名以及移动位置的示例代码
Jan 19 Javascript
node跨域转发 express+http-proxy-middleware的使用
May 31 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
Nov 04 Javascript
原生js+css调节音量滑块
Jan 15 Javascript
TypeScript之调用栈的实现
Dec 31 #Javascript
Vue通过配置WebSocket并实现群聊功能
Dec 31 #Javascript
Vue实现剪贴板复制功能
Dec 31 #Javascript
Vue+Element实现网页版个人简历系统(推荐)
Dec 31 #Javascript
小程序外卖订单界面的示例代码
Dec 30 #Javascript
记录微信小程序 height: calc(xx - xx);无效问题
Dec 30 #Javascript
JS三级联动代码格式实例详解
Dec 30 #Javascript
You might like
PHP session会话的安全性分析
2011/09/08 PHP
PHP准确取得服务器IP地址的方法
2015/06/02 PHP
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
使用js显示当前时间示例
2014/03/02 Javascript
原生javascript实现拖动元素示例代码
2014/09/01 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
微信小程序 欢迎页面的制作(源码下载)
2017/01/09 Javascript
canvas红包照片实例分享
2017/02/28 Javascript
使用gulp搭建本地服务器并实现模拟ajax
2017/04/05 Javascript
JS HTML图片显示Canvas 压缩功能
2017/07/21 Javascript
Javascript 严格模式use strict详解
2017/09/16 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
iview Upload组件多个文件上传的示例代码
2018/09/30 Javascript
提升node.js中使用redis的性能遇到的问题及解决方法
2018/10/30 Javascript
详解Webpack抽离第三方类库以及common解决方案
2020/03/30 Javascript
JS eval代码快速解密实例解析
2020/04/23 Javascript
[36:19]2018DOTA2亚洲邀请赛 小组赛 A组加赛 Newbee vs LGD
2018/04/03 DOTA
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
[05:59]带你看看DPC的台前幕后
2021/03/11 DOTA
在Django框架中编写Contact表单的教程
2015/07/17 Python
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
Python基于高斯消元法计算线性方程组示例
2018/01/17 Python
Python3单行定义多个变量或赋值方法
2018/07/12 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
python统计文章中单词出现次数实例
2020/02/27 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
2020/07/06 Python
Python之多进程与多线程的使用
2021/02/23 Python
班主任工作经验材料
2014/02/02 职场文书
房务中心文员岗位职责
2014/04/16 职场文书
优秀员工演讲稿
2014/05/19 职场文书
财务审计整改报告
2014/11/06 职场文书
三十年同学聚会感言
2015/07/30 职场文书
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android