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 相关文章推荐
multiSteps 基于Jquery的多步骤滑动切换插件
Jul 22 Javascript
jquery中使用ajax获取远程页面信息
Nov 13 Javascript
分享一个asp.net pager分页控件
Jan 04 Javascript
js判断鼠标位置是否在某个div中的方法
Feb 26 Javascript
js 实现一些跨浏览器的事件方法详解及实例
Oct 27 Javascript
HTML5 js实现拖拉上传文件功能
Nov 20 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
Feb 21 Javascript
vue全局自定义指令-元素拖拽的实现代码
Apr 14 Javascript
JS使用cookie保存用户登录信息操作示例
May 30 Javascript
JS document文档的简单操作完整示例
Jan 13 Javascript
JS Generator 函数的含义与用法实例总结
Apr 08 Javascript
vue和小程序项目中使用iconfont的方法
May 19 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
DOM基础及php读取xml内容操作的方法
2015/01/23 PHP
smarty模板判断数组为空的方法
2015/06/10 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
PHP基于单例模式编写PDO类的方法
2016/09/13 PHP
PHP实现的XML操作类【XML Library】
2016/12/29 PHP
PHP使用观察者模式处理异常信息的方法详解
2019/09/24 PHP
28个JS验证函数收集
2010/03/02 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
AngularJS 中的事件详解
2016/07/28 Javascript
使用grunt合并压缩js和css文件的方法
2017/03/02 Javascript
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
2017/05/03 Javascript
微信小程序 支付功能(前端)的实现
2017/05/24 Javascript
深入浅析Vue中的slots/scoped slots
2018/04/03 Javascript
es6 filter() 数组过滤方法总结
2019/04/03 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
在vue中给后台接口传的值为数组的格式代码
2020/11/12 Javascript
JavaScript ES 模块的使用
2020/11/12 Javascript
[01:29:46]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第二局
2016/02/27 DOTA
在Python的Django框架中使用通用视图的方法
2015/07/21 Python
八大排序算法的Python实现
2021/01/28 Python
Python实现按特定格式对文件进行读写的方法示例
2017/11/30 Python
Python hmac模块使用实例解析
2019/12/24 Python
关于Kotlin中SAM转换的那些事
2020/09/15 Python
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
PHP如何删除一个Cookie值
2012/11/15 面试题
七年级数学教学反思
2014/01/22 职场文书
竞选大队长演讲稿
2014/04/29 职场文书
医药销售自荐书
2014/05/29 职场文书
社会实践活动总结范文
2014/07/03 职场文书
2014最新版群众路线四风整改措施
2014/09/24 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
客户答谢会致辞
2015/01/20 职场文书
2014年终个人总结报告
2015/03/09 职场文书
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL
HttpClient实现文件上传功能
2022/08/14 Java/Android