自定义指令
除了内置的指令以外,Vue 允许用户注册自定义指令。在某些情况下需要对普通 DOM 元素进行操作的时候就可以使用自定义指令。
在 Vue2 中,自定义指令分为 全局指令 和 局部指令,全局指令是在 new Vue 之前定义的指令,作用在整个应用中。局部指令是在组件中定义的指令,只能作用在该组件内。
全局指令的注册:
- 通过
directive函数注册。
Vue.directive('focus', {
//...
})
Vue.directive第一参数是指令名称,第二参数是配置对象,用于定义钩子函数。
局部指定的注册:
- 在组件内部通过
directives属性注册,directives属性和data数据对象同级定义。
directives: {
focus: {
//...
}
}
directives以key-value形式定义指令,key是指令名称,value是配置对象。
注册的指令需要加上前缀 v- 使用,例如上面 focus 指令,在模板中使用时要写成 v-focus。
钩子函数
-
bind:- 只调用一次,在指令第一次绑定到元素时调用。
-
inserted:- 被绑定元素插入到父节点调用。
-
update:- 组件更新之前调用。
-
componentUpdated:- 组件更新之后调用。
-
unbind:- 指令解绑时调用,一般也就组件或元素销毁的时候才会调用。
bind是在插入前调用,该阶段DOM已经创建,但是还未插入到父元素中,所以此时访问不到父节点。
inserted是在插入父节点时调用,此时可以访问到父节点。
Vue.directive('focus', {
bind() {},
inserted() {},
update() {},
componentUpdated() {}
unbind() {}
})
注意:在钩子函数中无法使用
this指向当前实例。
钩子函数参数
el:- 指令所绑定的元素,可以用来直接操作 DOM。
binding (参数对象):name:- 指令名称,不包含
v-前缀。
- 指令名称,不包含
value:- 指令的值,例如:
v-focus="1 + 1",绑定的值为 2。
- 指令的值,例如:
oldValue:- 旧的指令值,只有
update和componentUpdated钩子中可以用。
- 旧的指令值,只有
expression:- 字符串形式的指令表达式,例如:
v-focus="1 + 1",表达式为:"1 + 1"。
- 字符串形式的指令表达式,例如:
arg:- 指令参数,例如:
v-focus:foo,foo就是指令参数。
- 指令参数,例如:
modifiers:- 一个包含修饰符的对象,例如:
v-focus.a.b,修饰符对象为:{ a: true, b: true }
- 一个包含修饰符的对象,例如:
vnode:虚拟DOM,Vue编译的虚拟节点。
oldVnode:旧的虚拟DOM,只有update和componentUpdated钩子中可以用。
函数简写
如果只需要使用到 bind 和 update 钩子,不关心其他的钩子,可以将对象写成一个函数。
Vue.directive('focus', function (el, binding) {
//...
})