如何写一个vue指令directive

Posted 犹记惊鸿照影(JS)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何写一个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]

以上是关于如何写一个vue指令directive的主要内容,如果未能解决你的问题,请参考以下文章

在Vue中如何创建全局指令

vue中自定义指令

vue.js实现内部自定义指令和全局自定义指令------directive

怎么写一个全局的自定义指令

Vue.directive 自定义指令的问题

vue给 dom 添加拖拽功能