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的三种$()
Dec 30 Javascript
javascript+mapbar实现地图定位
Apr 09 Javascript
javascript动态改变img的src属性图片不显示的解决方法
Oct 20 Javascript
js+css实现tab菜单切换效果的方法
Jan 20 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
Jul 25 Javascript
微信小程序 wxapp内容组件 text详细介绍
Oct 31 Javascript
微信小程序实现选项卡效果
Nov 06 Javascript
详解webpack打包后如何调试的方法步骤
Nov 07 Javascript
JavaScript实现数字前补“0”的五种方法示例
Jan 03 Javascript
Node.js Buffer模块功能及常用方法实例分析
Jan 05 Javascript
vue input实现点击按钮文字增删功能示例
Jan 29 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
Oct 24 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会员权限控制实现原理分析
2011/05/29 PHP
利用PHP实现一个简单的用户登记表示例
2017/04/25 PHP
使用WAMP搭建PHP本地开发环境
2017/05/10 PHP
强制设为首页代码
2006/06/19 Javascript
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
javascript的数据类型、字面量、变量介绍
2012/05/23 Javascript
采用call方式实现js继承
2014/05/20 Javascript
node.js中的dns.getServers方法使用说明
2014/12/08 Javascript
AngularJS自动表单验证
2016/02/01 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
AngularJS 服务详细讲解及示例代码
2016/08/17 Javascript
JavaScript获取select中text值的方法
2017/02/13 Javascript
nodejs入门教程五:连接数据库的方法分析
2017/04/24 NodeJs
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
[01:08:17]2018DOTA2亚洲邀请赛3月29日 小组赛B组 EG VS VGJ.T
2018/03/30 DOTA
Python内置函数之filter map reduce介绍
2014/11/30 Python
Python map和reduce函数用法示例
2015/02/26 Python
python多线程socket编程之多客户端接入
2017/09/12 Python
浅谈Python黑帽子取代netcat
2018/02/10 Python
python email smtplib模块发送邮件代码实例
2018/04/26 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
2019/06/04 Python
Python中字符串List按照长度排序
2019/07/01 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
pycharm如何使用anaconda中的各种包(操作步骤)
2020/07/31 Python
CSS3中box-shadow的用法介绍
2015/07/15 HTML / CSS
Java里面有没有全局变量?为什么?
2015/02/06 面试题
男方父母婚礼答谢词
2014/01/25 职场文书
创新比赛获奖感言
2014/02/13 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
2014年检验科工作总结
2014/11/22 职场文书
迟到检讨书范文
2015/01/27 职场文书
2015年安全生产责任书
2015/01/30 职场文书
小区保洁员岗位职责
2015/04/10 职场文书
企业版Windows 11有哪些新功能? Win11适用于企业的功能介绍
2021/11/21 数码科技