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 相关文章推荐
javascript之大字符串的连接的StringBuffer 类
May 08 Javascript
jQuery插件jQuery-JSONP开发ajax调用使用注意事项
Nov 22 Javascript
js设置控件的隐藏与显示的两种方法
Aug 21 Javascript
JavaScript判断浏览器类型的方法
Feb 10 Javascript
jQuery拖拽插件gridster使用指南
Apr 21 Javascript
易被忽视的js事件问题总结
May 14 Javascript
jquery选择器中的空格与大于号&gt;、加号+与波浪号~的区别介绍
Jun 24 Javascript
浅谈angularjs $http提交数据探索
Jan 20 Javascript
JavaScript中arguments和this对象用法分析
Aug 08 Javascript
vue移动端实现手机左右滑动入场动画
Jun 17 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
Sep 17 Javascript
jQuery实现异步上传一个或多个文件
Aug 17 jQuery
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详细彻底学习Smarty
2008/03/27 PHP
解析VS2010利用VS.PHP插件调试PHP的方法
2013/07/19 PHP
jQuery+CSS 实现的超Sexy下拉菜单
2010/01/17 Javascript
页面回到顶部的三种实现(锚标记,js)
2012/10/01 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
JS实现简单路由器功能的方法
2015/05/27 Javascript
jquery append 动态添加的元素事件on 不起作用的解决方案
2015/07/30 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
2016/06/22 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
2016/12/31 Javascript
AngularJS+bootstrap实现动态选择商品功能示例
2017/05/17 Javascript
webpack配置打包后图片路径出错的解决
2018/04/26 Javascript
Vue-Router的使用方法
2018/09/05 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
vue页面切换过渡transition效果
2018/10/08 Javascript
小程序实现订单倒计时功能
2019/04/23 Javascript
关于layui 下拉列表的change事件详解
2019/09/20 Javascript
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
vue项目中播放rtmp视频文件流的方法
2020/09/17 Javascript
[01:15:29]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第三局
2016/03/04 DOTA
Python性能优化的20条建议
2014/10/25 Python
Python的地形三维可视化Matplotlib和gdal使用实例
2017/12/09 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
基于python实现蓝牙通信代码实例
2019/11/19 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
Sony C++笔试题
2013/03/10 面试题
土木工程师职业规划范文
2014/03/07 职场文书
《九寨沟》教学反思
2014/04/08 职场文书
美丽家庭事迹材料
2014/05/03 职场文书
2014年班级工作总结范文
2014/12/23 职场文书
2016习总书记系列重要讲话心得体会
2016/01/15 职场文书
python 中[0]*2与0*2的区别说明
2021/05/10 Python