vue有很多内置指令,如:v-if、v-show、v-for等这些指令满足我们大部分的业务需求,不过在需要特殊的功能时,我们依然希望对DOM进行底层操作,这时就用到自定义指令
自定义指令也分全局注册和局部注册
//全局注册
Vue.directive('focus',{
//指令选项
})
//局部注册
var app =new Vue({
el:'#app',
directives:{
focus:{
//指令选项
}
}
})
自定义指令选项有几个钩子函数组成
-
bind:只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以自定义一个绑定时执行一次的初始化动作
-
inserted:被绑定元素插入父节点时调用,
-
update:被绑定元素所在模板更新时调用,无论绑定的值是否变化,通过比较更新前后模板绑定值的变化,可以忽略不必要的模板更新
-
componentUpdated:被绑定元素所在模板完成一次更新周期时调用
-
unbind:只调用一次,指令与元素解绑时调用
钩子函数的参数
el:指令所绑定的元素,可以直接操作Dom
binding 一个对象包含以下属性
- name:指令名字不包括V-前缀 value:指令绑定的值
- oldValue:指令绑定的前一个值,尽在update和componentUpdate可用,无论值是否发生变化
- expression:绑定值得字符串形式 arg:传给指令的参数
- modifies:一个包含修饰符的对象
vnode:Vue编译生成的虚拟节点
oldNode:上一个虚拟节点仅在update和componentUpdate钩子中可用
栗子:
<div id="app">
<div v-test:msg.a.b="message">
</div>
</div>
<script>
Vue.directive('test',{
//指令选项
bind:function( el,binging,vnode){
var keys=[];
for(var i in vnode){
keys.push(i)
}
el.innerHTML=
'name:' + binding.name + '<br>' +
'value:' + binding.value + '<br>' +
'expression:' + binding.expression + '<br>' +
'argument:' + binding.arg +'<br>'+
'modifies:' + JSON.stringify(binding.modifies) +'<br>'+
'vnode:' +keys.join(',')
}
})
var app = new Vue({
el:'#app',
data:{
message:'some text'
}
})
</script>