详解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 相关文章推荐
很酷的javascript loading效果代码
Jun 18 Javascript
JavaScript类型转换方法及需要注意的问题小结(挺全面)
Nov 11 Javascript
JQuery中属性过滤选择器用法实例分析
May 18 Javascript
Bootstrap复选框和单选按钮美化插件(推荐)
Nov 23 Javascript
深入理解Javascript中的valueOf与toString
Jan 04 Javascript
js控制文本框禁止输入特殊字符详解
Apr 07 Javascript
Angularjs的启动过程分析
Jul 18 Javascript
Angular中支持SCSS的方法
Nov 18 Javascript
javascript实现循环广告条效果
Dec 12 Javascript
JS实现读取xml内容并输出到div中的方法示例
Apr 19 Javascript
配置一个vue3.0项目的完整步骤
Apr 26 Javascript
ES6 十大特性简介
Dec 09 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
我的论坛源代码(三)
2006/10/09 PHP
PHP中for循环语句的几种变型
2007/03/16 PHP
PHP批量生成静态HTML的简单原理和方法
2014/04/20 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
2015/12/17 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
PHP实现获取url地址中顶级域名的方法示例
2019/06/05 PHP
W3C Group的JavaScript1.8 新特性介绍
2009/05/19 Javascript
关于JavaScript的with 语句的使用方法
2011/05/09 Javascript
13 个JavaScript 性能提升技巧分享
2012/07/26 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
详解webpack打包时排除其中一个css、js文件或单独打包一个css、js文件(两种方法)
2018/10/26 Javascript
javascript中的闭包概念与用法实践分析
2019/07/26 Javascript
JS实现提示效果弹出及延迟隐藏的功能
2019/08/26 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
使用Django和Python创建Json response的方法
2018/03/26 Python
老生常谈python中的重载
2018/11/11 Python
详解从Django Rest Framework响应中删除空字段
2019/01/11 Python
如何在pycharm中安装第三方包
2020/10/27 Python
详解CSS3 用border写 空心三角箭头 (两种写法)
2017/09/29 HTML / CSS
HTML5 form标签之解放表单验证、增加文件上传、集成拖放的使用方法
2013/04/24 HTML / CSS
PatPat阿根廷:妈妈们的购物平台
2019/05/30 全球购物
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
抽象类和接口的区别
2012/09/19 面试题
优秀生推荐信范文
2013/11/28 职场文书
文秘档案管理岗位职责
2014/03/06 职场文书
单位工程竣工验收方案
2014/03/16 职场文书
企业文化宣传标语
2014/06/09 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
鲁迅故居导游词
2015/02/05 职场文书
2015年小学美术工作总结
2015/05/25 职场文书
债务追讨律师函
2015/06/24 职场文书
python如何查找列表中元素的位置
2022/05/30 Python
Shell中的单中括号和双中括号的用法详解
2022/12/24 Servers