阅读目录

vue自定义指令clickoutside.js的理解

vue自定义指令请看如下博客:

vue自定义指令

一般在需要 DOM 操作时我们都需要使用自定义指令的方式去实现,当然一些特殊的事件监听也可以使用指令,例如监听外部点击事件:

我们可以看下 clickoutside.js 如何实现的,如下代码:

const clickoutsideContext = '@@clickoutsideContext';

export default {
/*
@param el 指令所绑定的元素
@param binding {Object}
@param vnode vue编译生成的虚拟节点
*/
bind (el, binding, vnode) {
const documentHandler = function(e) {
console.log(el)
console.log(e.target);
console.log(vnode);
console.log(binding); if(!vnode.context || el.contains(e.target)) {
return false;
}
if (binding.expression) {
vnode.context[el[clickoutsideContext].methodName](e)
} else {
el[clickoutsideContext].bindingFn(e);
}
}
el[clickoutsideContext] = {
documentHandler,
methodName: binding.expression,
bindingFn: binding.value
}
setTimeout(() => {
document.addEventListener('click', documentHandler);
}, 0)
},
update (el, binding) {
el[clickoutsideContext].methodName = binding.expression;
el[clickoutsideContext].bindingFn = binding.value;
},
unbind(el) {
document.removeEventListener('click', el[clickoutsideContext].documentHandler);
}
}

在外部调用 clickoutside.vue 代码如下:

<template>
<div v-clickoutside="handleClickOutSide">1111111</div>
</template> <script>
import clickoutside from '../../directive/clickoutside';
export default {
methods: {
handleClickOutSide(e) {
// 当外部被点击时调用
console.log(e);
console.log(111)
}
},
directives: {
clickoutside
}
}
</script>

具体效果可以 查看git上的demo

把代码克隆下来,在本地运行项目 npm run dev 就可以启动本地项目预览~

下面我们来分下下 如上打印的字段含义:

当我随便在document点击一下,会打印console.log() 如下信息的含义:

1. console.log(el);  指被绑定的元素,打印信息如下:

<div>1111111</div>;

2. console.log(e.target); 打印信息如下:

3. console.log(vnode); 打印信息如下:

4. console.log(binding); 打印信息如下:

当我点击一下,会调用外部的方法:

methods: {
handleClickOutSide(e) {
// 当外部被点击时调用
console.log(e);
console.log(111)
}
},

vue自定义指令(Directive中的clickoutside.js)的理解的更多相关文章

  1. vue 自定义指令directive

    //自定义指令:directive 的传参--可以数据也可以是字符串 Vue.directive('scroll', function (binding) { window.addEventListe ...

  2. Vue自定义指令 数据传递

    在项目开发过程中,难免会遇到各种功能需要使用Vue自定义指令--directive 去实现 .关于directive的使用方式这里就不做过多的介绍了,Vue官方文档中说的还是听明白的.今天讲讲在使用V ...

  3. vue从入门到进阶:自定义指令directive,插件的封装以及混合mixins(七)

    一.自定义指令directive 除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令.注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件.然而,有的 ...

  4. vue自定义指令clickoutside使用以及扩展用法

    vue自定义指令clickoutside使用以及扩展用法 产品使用vue+element作为前端框架.在功能开发过程中,难免遇到使用element的组件没办法满足特殊的业务需要,需要对其进行定制,例如 ...

  5. vue自定义指令clickoutside扩展--多个元素的并集作为inside

    都是个人理解,如果发现错误,恳请大家批评指正,谢谢.还有我说的会比较啰嗦,因为是以自身菜鸡水平的视角来记录学习理解的过程,见谅. 1.前言 产品使用vue+element作为前端框架.在功能开发过程中 ...

  6. vue 自定义指令(directive)实例

    一.内置指令 1.v-bind:响应并更新DOM特性:例如:v-bind:href  v-bind:class  v-bind:title  v-bind:bb 2.v-on:用于监听DOM事件: 例 ...

  7. Vue input 控件: 通过自定义指令(directive)使用正则表达式限制input控件的输入

    前言: 网站中的input输入框使用非常广泛,因业务场景不同需要对输入框做合法性校验或限制输入,比如电话号码.邮件.区号.身份证号等.input框的不合法内容主要有两种方式处理:1.用户输入内容后,通 ...

  8. Vue自定义指令报错:Failed to resolve directive: xxx

    Vue自定义指令报错 Failed to resolve directive: modle 这个报错有2个原因: 1.指令单词拼错 2.Vue.directive() 这个方法没有写在 new Vue ...

  9. 每个人都能实现的vue自定义指令

    前文 先来bb一堆废话哈哈.. 用vue做项目也有一年多了.除了用别人的插件之外.自己也没尝试去封装指令插件之类的东西来用. 刚好最近在项目中遇到一个问题.(快速点击按钮多次触发多次绑定的方法),于是 ...

随机推荐

  1. 读 《CSharp Coding Guidelines》有感

    目录 基本原则 类设计指南 属性成员设计指南 其他设计指南 可维护性指南 命名指南 性能指南 框架指南 文档指南 布局指南 相关链接 C# 编程指南 前不久在 Github 上看见了一位大牛创建一个仓 ...

  2. polyfill-eventsource added missing EventSource to window ie浏览器 解决方案

    今天遇到一个 ie浏览器显示空白,报错内容是: polyfill-eventsource added missing EventSource to window的问题, import 'babel-p ...

  3. H5调拨打电话界面

    <a href=”tel:15771791266 ”>拨打电话</a> 切记不要用js调用  直接用a标签 苹果安卓塞班都能调起来

  4. 【pygame游戏编程】第五篇-----动画显示

    import pygame import sys import os pygame.init() #窗口居中 os.environ[' screen_width = 600 screen_high = ...

  5. 【读书笔记】iOS-解析JSON

    JSON相比XML最显著的优点是不需要使用重量级的解析库,因为其本身就是面向数据的,而且非常容易转换成哈希字典.除此之外,JSON文档相比同样的XML文档更小.在网络宽带有限的情况下,你很容易在Iph ...

  6. drupal 2006 mysql server has gone away

    在开发一个cms drupal网站时遇到了如上图的错误,几经百度谷歌,都一致说需要修改mysql的配置 max_allowed_packet参数,但是由于我买的是虚拟主机,并没有权限修改. 本来已经放 ...

  7. LazyMan深入解析和实现

    一.题目介绍  以下是我copy自网上的面试题原文: 实现一个LazyMan,可以按照以下方式调用: LazyMan("Hank")输出: Hi! This is Hank!   ...

  8. unresolved external symbol boost::throw_exception

    使用boost库,VS生成的时候一直报错, error LNK2019: 无法解析的外部符号 "void __cdecl boost::throw_exception(class std:: ...

  9. [20171115]ZEROCONF ROUTE.txt

    [20171115]ZEROCONF ROUTE.txt --//如果你检查linux服务器的网络配置,就可以发现如下一条路由: #  route -n | egrep "169.254|D ...

  10. linux下zip文件解压乱码的问题

    因为编码问题,zip文件中的中文文件在linux下解压会出现乱码 如果你使用archlinux那么使用AUR安装unzip-natspec就可以解决这个问题 https://aur.archlinux ...