详解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下有关dom以及xml节点访问兼容问题
Nov 26 Javascript
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
Aug 14 Javascript
jquery单行文字向上滚动效果的实现代码
Sep 05 Javascript
jquery带翻页动画的电子杂志代码分享
Aug 21 Javascript
Javascript中神奇的this
Jan 20 Javascript
jQuery 3 中的新增功能汇总介绍
Jun 12 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
Feb 08 Javascript
详解在vue-cli项目中使用mockjs(请求数据删除数据)
Oct 23 Javascript
解决LayUI数据表格复选框不居中显示的问题
Sep 25 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
Nov 01 Javascript
jQuery擦除插件eraser使用方法详解
Jan 11 jQuery
JS Object构造函数之Object.freeze
Apr 28 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
上海地方志办公室-上海电子仪表工业志
2021/03/04 无线电
Memcache 在PHP中的使用技巧
2010/02/08 PHP
PHP 动态随机生成验证码类代码
2010/04/09 PHP
项目中应用Redis+Php的场景
2016/05/22 PHP
jQuery 使用手册(三)
2009/09/23 Javascript
JS 对象介绍
2010/01/20 Javascript
js中将URL中的参数提取出来作为对象的实现代码
2011/08/16 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
JavaScript对象学习经验整理
2013/10/12 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
基于Vue实现平滑过渡的拖拽排序功能
2019/06/12 Javascript
vue给对象动态添加属性和值的实例
2019/09/09 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
Vue前端项目部署IIS的实现
2020/01/06 Javascript
微信小程序实现翻牌抽奖动画
2020/09/21 Javascript
python实现将英文单词表示的数字转换成阿拉伯数字的方法
2015/07/02 Python
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
python连接mongodb密码认证实例
2018/10/16 Python
Python中的元组介绍
2019/01/28 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
Python 批量读取文件中指定字符的实现
2020/03/06 Python
python基于socket函数实现端口扫描
2020/05/28 Python
pandas分批读取大数据集教程
2020/06/06 Python
Spring http服务远程调用实现过程解析
2020/06/11 Python
keras 模型参数,模型保存,中间结果输出操作
2020/07/06 Python
Python通过类的组合模拟街道红绿灯
2020/09/16 Python
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
Holland & Barrett爱尔兰:英国领先的健康零售商
2019/03/31 全球购物
大学生活学习的自我评价
2013/12/03 职场文书
关于孝道的演讲稿
2014/05/21 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL