如何写一个vue指令directive

举个例子 :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);
  }
}

directive是怎么实现的呢?

1、在binding中写绑定方法

2、方法需要写在一个环境(context)中,放置泄露

如上定义了:el[clickoutsideContext]

时间: 2024-08-30 09:39:17

如何写一个vue指令directive的相关文章

写一个vue组件

写一个vue组件 我下面写的是以.vue结尾的单文件组件的写法,是基于webpack构建的项目.如果还不知道怎么用webpack构建一个vue的工程的,可以移步到vue-cli. 一个完整的vue组件会包括一下三个部分: template:模板 js: 逻辑 css : 样式 每个组件都有属于自己的模板,js和样式.如果将一个页面比喻成一间房子的话,组件就是房子里的客厅.卧室.厨房.厕所.如果把厨房单独拿出来的话,组件又可以是刀.油烟机...等等.就是说页面是由组件构成的,而组件也可以是组件构成

学习如何写一个vue插件【入门篇】

#### 疑答 1.市面上已经有那么多插件可用,为什么还要造轮子?学习.借鉴思想.应用到开发 2.能否在项目中使用?与网上插件使用相同   更新维护问题怎么解决? 自身动力,使用者反馈等 #### 准备工具 1.官方文档https://cn.vuejs.org/v2/guide/plugins.html2.github.npm网站账号.node/npm.git3.代码工具:vscode #### 过程1.新建文件夹 vue-loading-text npm init 初始化 2.代码工具:vsc

Vue框架(一)——Vue导读、Vue实例(挂载点el、数据data、过滤器filters)、Vue指令(文本指令v-text、事件指令v-on、属性指令v-bind、表单指令v-model)

Vue导读 1.Vue框架 vue是可以独立完成前后端分离式web项目的js框架 三大主流框架之一:Angular.React.Vue vue:结合其他框架优点.轻量级.中文API.数据驱动.双向绑定.MVVM设计模式.组件化开发.单页面应用 Vue环境:本地导入和cdn导入 2.Vue是渐进式js框架 通过对框架的了解与运用程度,来决定其在整个项目中的应用范围,最终可以独立以框架方式完成整个web前端项目.3.怎么使用vue 去官网下载然后导入 <div id="app">

写一个简单vue 中间件,$emit、$on

前言 使用过vue的同学大多数都知道$emit 与$on的使用.我们仅仅知道使用,有时候是完全不够的.现在我就带领大家写一个简单类似于vue空实例的中间件. 非父子组件的通信 非父子组件的通信vue官网给出这样的解决方案. 有时候,非父子关系的两个组件之间也需要通信.在简单的场景下,可以使用一个空的 Vue 实例作为事件总线: var bus = new Vue() // 触发组件 A 中的事件 bus.$emit('id-selected', 1) // 在组件 B 创建的钩子中监听事件 bu

Vue指令实战:结合bootstrap做一个用户信息输入表格

结合前面的vue指令做了个小例子,用户在表单里面输入用户名和年龄,点击"添加"以后会保存到用户信息表里面 <!DOCTYPE html> <html> <head lang="en">     <meta charset="UTF-8">     <meta name="viewport" content="width=device-width, initial-

vue指令03---自动获取焦点(自定义指令)和过滤器的学习

1.1 自动获取焦点 在自动获取焦点的学习中涉及到了一个钩子函数 mounted(),它表示页面一加载进来就执行函数里面的内容,(和window.onload相似,这样有助于理解),mounted 钩子函数的名字不能随便更改,而且不能写在 methods 属性里面    方法1:  在vue中 通过操作 dom 元素来实现自动获取焦点(即使用原生JS实现) 代码如下: 1 <html lang="en"> 2 <head> 3 <title>自动获取

(尚016)Vue指令(11个自带指令+自定义指令)

1.Vue常用指令 1)v:text:更新元素的 textContent 2)v-html:更新元素的 innerHTML 3)v-if:如果为true,当前标签才会输出到页面 4)v-else:如果为false,当前标签才会输出到页面 5)v-show:通过控制display样式来控制显示/隐藏 6)v-for:遍历数组/对象(最终通过列表显示) 7)v-on:绑定事件监听,一般简写为@ 8)v-bind:强制绑定解析表达式,可以省略v-bind,简写为  : 9)v-model:双向数据绑定

vue指令大全~~~

是的,这里有很全的vue指令使用~ 1.简单的vue应用 vue作为一个mvvm框架,想想为什么叫做mvvm? Model是负责数据的存储, View负责页面的展示 Model View 负责业务逻辑处理,对数据加工后视图展示 MVVM的作用是业务逻辑代码与视图代码完全分离,各自的职责更加清晰~ <body> <!--mvvm里面的v--> <div id="app"> {{val}} </div> <script src=&quo

vue 指令---气泡提示(手撸实战)

菜鸟学习之路//L6zt github 自己在造组件轮子,也就是瞎搞.自己写了个slider组件,想加个气泡提示.为了复用和省事特此写了个指令来解决.预览地址项目地址 github 我叫给它胡博 我对指令的理解: 前不久看过 一部分vnode实现源码,奈何资质有限...看不懂.vnode的生命周期-----> 生成前.生成后.生成真正dom.更新 vnode.更新dom . 销毁.而Vue的指令则是依赖于vnode 的生命周期, 无非也是有以上类似的钩子.代码效果 指令挂A元素上,默认生成一个气