详解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 03 Javascript
Jquery 表单验证类介绍与实例
Jun 09 Javascript
javascript监听鼠标滚轮事件浅析
Jun 05 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
Mar 04 Javascript
JS选项卡动态替换banner图片路径的方法
May 11 Javascript
jquery+css实现动感的图片切换效果
Nov 25 Javascript
详谈JavaScript的闭包及应用
Jan 17 Javascript
JS对象是否拥有某属性如何判断
Feb 03 Javascript
简单谈谈关于Angular Cli打包的事
Sep 05 Javascript
Vue父子组件之间的通信实例详解
Sep 28 Javascript
bootstrap实现嵌套模态框的实例代码
Jan 10 Javascript
angular4实现带搜索的下拉框
Mar 25 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组合排序简单实现方法
2016/10/15 PHP
php分享朋友圈的实现代码
2019/02/18 PHP
不错的一个日期输入 动态
2006/11/06 Javascript
JavaScript 学习笔记(六)
2009/12/31 Javascript
js继承的实现代码
2010/08/05 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
设计模式中的组合模式在JavaScript程序构建中的使用
2016/05/18 Javascript
validationEngine 表单验证插件使用实例代码
2017/06/15 Javascript
Angular排序实例详解
2017/06/28 Javascript
JavaScript 保护变量不被随意修改的实现代码
2017/09/27 Javascript
微信小程序页面生命周期详解
2018/01/31 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
Vue自定义组件双向绑定实现原理及方法详解
2020/09/03 Javascript
[02:59]DOTA2完美大师赛主赛事第三日精彩集锦
2017/11/25 DOTA
python连接mysql并提交mysql事务示例
2014/03/05 Python
Python 字典dict使用介绍
2014/11/30 Python
Python数据类型详解(二)列表
2016/05/08 Python
pip安装时ReadTimeoutError的解决方法
2018/06/12 Python
如何理解python对象
2020/06/21 Python
CSS3 text-shadow实现文字阴影效果
2016/02/24 HTML / CSS
HTML5 画布canvas使用方法
2016/03/18 HTML / CSS
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
Vero Moda西班牙官方购物网站:丹麦BESTSELLER旗下知名女装品牌
2018/04/27 全球购物
创立科技Java面试题
2015/11/29 面试题
房地产销售大学生自我评价分享
2013/11/11 职场文书
初中物理教学反思
2014/01/14 职场文书
作文批改评语大全
2014/04/23 职场文书
班级学习雷锋活动总结
2014/07/04 职场文书
讲党性心得体会
2014/09/03 职场文书
费用申请报告范文
2015/05/15 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
MySQL的存储过程和相关函数
2022/04/26 MySQL
VUE递归树形实现多级列表
2022/07/15 Vue.js
数据设计之权限的实现
2022/08/05 MySQL
详解CSS3浏览器兼容
2022/12/24 HTML / CSS