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 相关文章推荐
select组合框option的捕捉实例代码
Sep 30 Javascript
如何让DIV可编辑、可拖动示例代码
Sep 18 Javascript
FireBug 调试JS入门教程 如何调试JS
Dec 23 Javascript
如何将php数组或者对象传递给javascript
Mar 20 Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
Apr 23 Javascript
javascript函数式编程程序员的工具集
Oct 11 Javascript
jQuery中text() val()和html()的区别实例详解
Jun 28 Javascript
javascript数据结构中栈的应用之符号平衡问题
Apr 11 Javascript
vue动态路由配置及路由传参的方式
May 23 Javascript
详解Vue CLI3配置解析之css.extract
Sep 14 Javascript
小程序实现展开/收起的效果示例
Sep 22 Javascript
element表格翻页第2页从1开始编号(后端从0开始分页)
Dec 10 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对大文件进行读取操作的实现代码
2013/01/23 PHP
C#使用PHP服务端的Web Service通信实例
2014/04/08 PHP
PHP依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
在UpdatePanel内jquery easyui效果失效的解决方法
2010/04/11 Javascript
Javascript中定义方法的另类写法(批量定义js对象的方法)
2011/02/25 Javascript
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
Javascript实现div的toggle效果实例分析
2015/06/09 Javascript
JavaScript实现图片滑动切换的代码示例分享
2016/03/06 Javascript
JavaScript表单焦点自动切换代码
2016/07/24 Javascript
关于vue.js弹窗组件的知识点总结
2016/09/11 Javascript
微信小程序 教程之小程序配置
2016/10/17 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
微信小程序访问node.js接口服务器搭建教程
2017/04/25 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
vue项目实战总结篇
2018/02/11 Javascript
微信小程序scroll-view实现字幕滚动
2018/07/14 Javascript
vue模仿网易云音乐的单页面应用
2019/04/24 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
Python 包含汉字的文件读写之每行末尾加上特定字符
2016/12/12 Python
Django自定义认证方式用法示例
2017/06/23 Python
python利用dlib获取人脸的68个landmark
2019/11/27 Python
通过Python实现一个简单的html页面
2020/05/16 Python
您的时尚,您的生活方式:DTLR Villa
2019/12/25 全球购物
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
中科方德软件测试面试题
2016/04/21 面试题
精彩的大学生自我评价
2013/11/17 职场文书
《从现在开始》教学反思
2014/04/15 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书
html+css 实现简易导航栏功能
2021/04/07 HTML / CSS
SQL实现LeetCode(178.分数排行)
2021/08/04 MySQL
Redis+Lua脚本实现计数器接口防刷功能(升级版)
2022/02/12 Redis