详解vue中点击空白处隐藏div的实现(用指令实现)


Posted in Javascript onApril 19, 2018

简单想应该怎么实现?

1、肯定是给document增加一个click事件监听
2、当发生click事件的时候判断是否点击的当前对象
结合着本思路和指令咱们来实现。

简单介绍vue指令

一个指令定义对象可以提供如下几个钩子函数 (均为可选):

  1. bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
  2. inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
  3. update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。
  4. componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
  5. unbind:只调用一次,指令与元素解绑时调用。

接下来我们来看一下钩子函数的参数 (即 el、binding、vnode 和 oldVnode)。

详解vue中点击空白处隐藏div的实现(用指令实现)

代码实现

创建指令对象,分析放在代码中

<template>
 <div>
 <div class="show" v-show="show" v-clickoutside="handleClose">
  显示
 </div>
 </div>
</template>

<script>
const clickoutside = {
 // 初始化指令
  bind(el, binding, vnode) {
    function documentHandler(e) {
  // 这里判断点击的元素是否是本身,是本身,则返回
      if (el.contains(e.target)) {
        return false;
  }
  // 判断指令中是否绑定了函数
      if (binding.expression) {
  // 如果绑定了函数 则调用那个函数,此处binding.value就是handleClose方法
        binding.value(e);
      }
 }
 // 给当前元素绑定个私有变量,方便在unbind中可以解除事件监听
    el.__vueClickOutside__ = documentHandler;
    document.addEventListener('click', documentHandler);
  },
  update() {},
  unbind(el, binding) {
 // 解除事件监听
    document.removeEventListener('click', el.__vueClickOutside__);
    delete el.__vueClickOutside__;
  },
};
export default {
  name: 'HelloWorld',
  data() {
    return {
      show: true,
    };
  },
  directives: {clickoutside},
  methods: {
    handleClose(e) {
      this.show = false;
    },
  },
};
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.show {
  width: 100px;
  height: 100px;
  background-color: red;
}
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
Mar 12 Javascript
Javascript的各种节点操作实例演示代码
Jun 27 Javascript
JavaScript运算符小结
Jun 03 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
Nov 18 Javascript
angularjs ui-router中路由的二级嵌套
Mar 10 Javascript
Vue.js实现文章评论和回复评论功能
May 30 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
Mar 08 Javascript
Less 安装及基本用法
May 05 Javascript
React 组件渲染和更新的实现代码示例
Feb 21 Javascript
基于js实现抽红包并分配代码实例
Sep 19 Javascript
Webpack设置环境变量的一些误区详解
Dec 19 Javascript
JavaScript实现图片合成下载的示例
Nov 19 Javascript
基于JS实现html中placeholder属性提示文字效果示例
Apr 19 #Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
Apr 19 #Javascript
JS使用setInterval实现的简单计时器功能示例
Apr 19 #Javascript
vue 实现通过手机发送短信验证码注册功能
Apr 19 #Javascript
详解react-redux插件入门
Apr 19 #Javascript
vuex state及mapState的基础用法详解
Apr 19 #Javascript
使用vuex的state状态对象的5种方式
Apr 19 #Javascript
You might like
PHP Token(令牌)设计
2008/03/15 PHP
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
PHP高级对象构建 多个构造函数的使用
2012/02/05 PHP
JS中剪贴板兼容性、判断复制成功或失败
2021/03/09 Javascript
js活用事件触发对象动作
2008/08/10 Javascript
JS获取当前网页大小以及屏幕分辨率等
2014/09/05 Javascript
Javascript实现获取及设置光标位置的方法
2015/07/21 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
Angular.js中控制器之间的传值详解
2017/04/24 Javascript
jquery实现左右轮播切换效果
2018/01/01 jQuery
在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程
2018/03/21 Javascript
又拍云 Node.js 实现文件上传、删除功能
2018/10/28 Javascript
Three.js中矩阵和向量的使用教程
2019/03/19 Javascript
Vue基础配置讲解
2019/11/29 Javascript
Vue v-bind动态绑定class实例方法
2020/01/15 Javascript
python爬虫入门教程--快速理解HTTP协议(一)
2017/05/25 Python
python多进程实现进程间通信实例
2017/11/24 Python
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
对Python 数组的切片操作详解
2018/07/02 Python
对Django项目中的ORM映射与模糊查询的使用详解
2019/07/18 Python
Python自动化导出zabbix数据并发邮件脚本
2019/08/16 Python
python安装gdal的两种方法
2019/10/29 Python
CSS3选择器新增问题的实现
2021/01/21 HTML / CSS
基于HTML5的WebGL经典3D虚拟机房漫游动画
2017/11/15 HTML / CSS
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
写给老师的表扬信
2014/01/21 职场文书
庆中秋节主题活动方案
2014/02/03 职场文书
实习协议书范本
2014/04/22 职场文书
应届本科毕业生求职信
2014/07/23 职场文书
民主生活会整改措施(党员)
2014/09/18 职场文书
工程部部长岗位职责
2015/02/12 职场文书
2015年化验室工作总结
2015/04/23 职场文书
z-index不起作用
2021/03/31 HTML / CSS
PYTHON InceptionV3模型的复现详解
2022/05/06 Python