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 相关文章推荐
转换json格式的日期为Javascript对象的函数
Jul 13 Javascript
javascript使用定时函数实现跳转到某个页面
Dec 25 Javascript
jquery幻灯片插件bxslider样式改进实例
Oct 15 Javascript
jQuery实现鼠标经过事件的延时处理效果
Aug 20 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
Jul 22 Javascript
js实时获取窗口大小变化的实例代码
Nov 18 Javascript
BootStrap实现带关闭按钮功能
Feb 15 Javascript
详解如何构建Promise队列实现异步函数顺序执行
Oct 23 Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
Jan 24 jQuery
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
Apr 25 Javascript
layui 富文本赋值,取值,取纯文本值的实例
Sep 18 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
Oct 31 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 第二节 数据类型之数组
2012/04/28 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
2014/06/30 PHP
php自定义urlencode,urldecode函数实例
2015/03/24 PHP
PHP访问数据库集群的方法小结
2016/03/14 PHP
一个简单安全的PHP验证码类 附调用方法
2016/06/24 PHP
Javascript常考语句107条收集
2010/03/09 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
2015/07/27 Javascript
每天一篇javascript学习小结(Function对象)
2015/11/16 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
nodejs mysql 实现分页的方法
2017/06/06 NodeJs
原生JS实现Ajax跨域请求flask响应内容
2017/10/24 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
2019/01/25 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
python 阶乘累加和的实例
2019/02/01 Python
python如何制作缩略图
2019/04/30 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
2019/06/26 Python
Python math库 ln(x)运算的实现及原理
2019/07/17 Python
关于python 的legend图例,参数使用说明
2020/04/17 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
解决阿里云邮件发送不能使用25端口问题
2020/08/07 Python
浅析border-radius如何兼容IE
2016/04/19 HTML / CSS
大学生求职简历的自我评价
2013/10/14 职场文书
国际政治个人自荐信范文
2013/11/26 职场文书
材料会计岗位职责
2014/03/06 职场文书
出售房屋协议书范本
2014/10/06 职场文书
地心历险记观后感
2015/06/15 职场文书
为什么node.js不适合大型项目
2021/04/28 Javascript
Golang 获取文件md5校验的方法以及效率对比
2021/05/08 Golang
浅谈Python数学建模之固定费用问题
2021/06/23 Python
从结婚开始的恋爱故事。小说《我的美好婚事》TV动画化决定
2022/04/07 日漫
MySQL数据库查询之多表查询总结
2022/08/05 MySQL