1、一个指令定义对象能够提供以下几个钩子函数 (均为可选):vue
bind
:只调用一次,指令第一次绑定到元素时调用。在这里能够进行一次性的初始化设置。(注意:binding这个词绑定,顾名思义在这个bind中进行绑定函数)node
inserted
:被绑定元素插入父节点时调用 (仅保证父节点存在,但不必定已被插入文档中)。 (实际的效果的实现,dom操做等等,样式渲染)express
update
:所在组件的 VNode 更新时调用,可是可能发生在其子 VNode 更新以前。指令的值可能发生了改变,也可能没有。可是你能够经过比较更新先后的值来忽略没必要要的模板更新 (详细的钩子函数参数见下)。api
componentUpdated
:指令所在组件的 VNode 及其子 VNode 所有更新后调用。dom
unbind
:只调用一次,指令与元素解绑时调用。ide
2、指令钩子函数会被传入如下参数:函数
el
:指令所绑定的元素,能够用来直接操做 DOM 。binding
:一个对象,包含如下属性:vnode
:Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
name
:指令名,不包括 v-
前缀。value
:指令的绑定值,例如:v-my-directive="1 + 1"
中,绑定值为 2
。oldValue
:指令绑定的前一个值,仅在 update
和 componentUpdated
钩子中可用。不管值是否改变均可用。expression
:字符串形式的指令表达式。例如 v-my-directive="1 + 1"
中,表达式为 "1 + 1"
。arg
:传给指令的参数,可选。例如 v-my-directive:foo
中,参数为 "foo"
。modifiers
:一个包含修饰符的对象。例如:v-my-directive.foo.bar
中,修饰符对象为 { foo: true, bar: true }
。oldVnode
:上一个虚拟节点,仅在 update
和 componentUpdated
钩子中可用。3、具体事例spa
一、clickoutside.jscode
用途:clickoutside.js主要用于解决点解元素外的地方时执行函数 主要应用的常见有弹出层点击遮罩层是隐藏窗口,或者一些弹出层点击其余地方要消失的场景component
v-clickoutside具体是怎么实现的
答:主要是经过在bind中定义函数 经过判断是否包含元素,执行binding.value函数
export default { /* @param el 指令所绑定的元素 @param binding {Object} @param vnode vue编译生成的虚拟节点 */ bind (el, binding, vnode) { const documentHandler = function(e) { if(!vnode.context || el.contains(e.target)) { return false; } if (binding.expression) { binding.value(e) } } document.addEventListener('click', documentHandler) }, update (el, binding) { }, unbind(el) { document.removeEventListener('click', documentHandler); } }