详解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 相关文章推荐
JQuery Tips(4) 一些关于提高JQuery性能的Tips
Dec 19 Javascript
高效的表格行背景隔行变色及选定高亮的JS代码
Dec 04 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
Mar 20 Javascript
jQuery实现分隔条左右拖动功能
Nov 21 Javascript
理解javascript闭包
Dec 15 Javascript
jquery简单倒计时实现方法
Dec 18 Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
Dec 02 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
Aug 31 Javascript
vuex存储token示例
Nov 11 Javascript
Javascript模块化机制实现原理详解
Apr 02 Javascript
uniapp,微信小程序中使用 MQTT的问题
Jul 11 Javascript
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 Vue.js
基于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中strtotime函数使用方法分享
2012/01/10 PHP
深入PHP中的HashTable结构详解
2013/06/13 PHP
PHP钩子与简单分发方式实例分析
2017/09/04 PHP
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
js闭包实例汇总
2014/11/09 Javascript
分享一则JavaScript滚动条插件源码
2015/03/03 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
深入理解js数组的sort排序
2016/05/28 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
2016/09/24 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
[01:08]DOTA2次级职业联赛 - Shield战队宣传片
2014/12/01 DOTA
[59:15]EG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/29 DOTA
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
python 读取excel文件生成sql文件实例详解
2017/05/12 Python
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
Flask核心机制之上下文源码剖析
2018/12/25 Python
Python实现的大数据分析操作系统日志功能示例
2019/02/11 Python
Python中一些深不见底的“坑”
2019/06/12 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
PYTHON发送邮件YAGMAIL的简单实现解析
2019/10/28 Python
python如果快速判断数字奇数偶数
2019/11/13 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
Django如何实现防止XSS攻击
2020/10/13 Python
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
Java的for语句中break, continue和return的区别
2013/12/19 面试题
求职简历推荐信范文
2013/12/02 职场文书
社区八一活动方案
2014/02/03 职场文书
民生工作实施方案
2014/05/31 职场文书
自愿解除劳动合同协议书
2014/09/11 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
北京英语导游词
2015/02/12 职场文书
超市主管竞聘书
2015/09/15 职场文书
Redis 哨兵集群的实现
2021/06/18 Redis