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 dom 操作详解 js加强
Jul 13 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
Feb 12 Javascript
jquery实现的图片点击滚动效果
Apr 29 Javascript
jQuery中dom元素上绑定的事件详解
Apr 24 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
Jun 04 Javascript
基于OL2实现百度地图ABCD marker的效果
Oct 01 Javascript
在JavaScript中调用Java类和接口的方法
Sep 07 Javascript
微信小程序 数据访问实例详解
Oct 08 Javascript
jquery 多个radio的click事件实例
Dec 03 Javascript
jQuery实现节点的追加、替换、删除、复制功能示例
Jul 11 jQuery
Vue 项目分环境打包的方法示例
Aug 03 Javascript
vue + axios get下载文件功能
Sep 25 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经典的给图片加水印程序
2006/12/06 PHP
php实现从ftp服务器上下载文件树到本地电脑的程序
2009/02/10 PHP
php 变量未定义等错误的解决方法
2011/01/12 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
2013/03/06 PHP
php筛选不存在的图片资源
2015/04/28 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
Yii遍历行下每列数据的方法
2016/10/17 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
PHP getName()函数讲解
2019/02/03 PHP
ECMAScript 基础知识
2007/06/29 Javascript
如何用js控制css中的float的代码
2007/08/16 Javascript
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
解析jquery获取父窗口的元素
2013/06/26 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
利用JavaScript判断浏览器类型及版本
2016/08/23 Javascript
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
2019/09/06 Javascript
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
python修改字典内key对应值的方法
2015/07/11 Python
python安装twisted的问题解析
2018/08/21 Python
在python中将字符串转为json对象并取值的方法
2018/12/31 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
2020/01/25 Python
python实现批量修改文件名
2020/03/23 Python
python爬取2021猫眼票房字体加密实例
2021/02/19 Python
html5配合css3实现带提示文字的输入框(摆脱js)
2013/03/08 HTML / CSS
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
一些Unix笔试题和面试题
2012/09/25 面试题
小学生防溺水广播稿
2014/01/12 职场文书
致垒球运动员加油稿
2014/02/16 职场文书
网吧最新创业计划书范文
2014/03/27 职场文书
高速铁道技术专业求职信
2014/08/09 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
opencv检测动态物体的实现
2021/07/21 Python