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 相关文章推荐
jquery实现表单输入时提示文字滑动向上效果
Aug 10 Javascript
jQuery 监控键盘一段时间没输入
Apr 22 Javascript
jquery html动态添加的元素绑定事件详解
May 24 Javascript
Listloading.js移动端上拉下拉刷新组件
Aug 04 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
Dec 08 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
Dec 18 Javascript
bootstrap提示标签、提示框实现代码
Dec 28 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
Jul 23 Javascript
Angular HMR(热模块替换)功能实现方法
Apr 04 Javascript
详解vue中的computed的this指向问题
Dec 05 Javascript
js简单的分页器插件代码实例
Sep 11 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
Jan 08 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
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
2006/10/09 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
PHP中TP5 上传文件的实例详解
2017/07/31 PHP
PHP获取当前系统时间的方法小结
2018/10/03 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
2018/12/21 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
关于jquery性能最佳实践的讨论,与求教
2012/03/30 Javascript
jQuery中change事件用法实例
2014/12/26 Javascript
java必学必会之static关键字
2015/12/03 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
JS与jQuery实现隔行变色的方法
2016/09/09 Javascript
Bootstrap精简教程中秋大放送
2016/09/15 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
2016/12/02 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
Node.js 异步异常的处理与domain模块解析
2017/05/10 Javascript
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
用Axios Element实现全局的请求loading的方法
2018/03/15 Javascript
vue动画打包后失效问题的解决方法
2018/09/18 Javascript
对angular4子路由&amp;辅助路由详解
2018/10/09 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
2019/11/11 jQuery
Vue 401配合Vuex防止多次弹框的案例
2020/11/11 Javascript
TensorFlow实现AutoEncoder自编码器
2018/03/09 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
Python使用combinations实现排列组合的方法
2018/11/13 Python
如何将你的应用迁移到Python3的三个步骤
2019/12/22 Python
python 获取域名到期时间的方法步骤
2021/02/10 Python
html5-websocket基于远程方法调用的数据交互实现
2012/12/04 HTML / CSS
意大利奢侈品购物网站:Deliberti
2019/10/08 全球购物
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
超市国庆节促销方案
2014/02/20 职场文书
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
后勤管理员岗位职责
2014/08/27 职场文书
2015年党风建设工作总结
2015/04/29 职场文书
2015年机械设备管理工作总结
2015/05/04 职场文书
Golang Web 框架Iris安装部署
2022/08/14 Python