码迷,mamicode.com
首页 > 其他好文 > 详细

如何写一个vue指令directive

时间:2017-12-17 16:58:05      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:listen   style   event   turn   编译   bind   一个   rect   vnode   

举个例子 :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]

如何写一个vue指令directive

标签:listen   style   event   turn   编译   bind   一个   rect   vnode   

原文地址:http://www.cnblogs.com/heyinwangchuan/p/8052211.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!