自定义指令
自定义指令基本就是用来操作DOM的,虽然官方推荐数据驱动视图,有时候还是需要自定义指令来操作DOM,指令可复用.
自定义指令,可以全局和局部注册,
1. 全局自定义指令
全局自定义指令需要使用 全局 API
Vue.directive( id, [definition] )
definition 可以是 函数和 json对象
自定义指令有5个钩子函数
Vue.directive('hello',{
bind(el,binding){
alert('只调用一次,指令第一次绑定到元素时调用,可执行初始化操作')
},
inserted(){
alert('被绑定元素插入DOM时调用')
},
update(){
alert('被绑定元素所在模板更新时调用')
},
componentUpdated(){
alert('被绑定元素所在模板更新完成后调用')
},
unbind(){
alert('只调用一次指令与元素解绑时调用')
}
})
钩子函数参数
- el:指令所绑定的元素,可以用来直接操作 DOM 。
- binding:一个对象包含以下属性
- name:指令名,不包括 v- 前缀
- rawName:指令名 包含 v-
- value:指令绑定值 比如v-hello='name' 绑定值就是vue data对象里 的name值
- expression:指令绑定值的字符串形式
- arg:传给指令的参数 v-hello:aaa='name' aaa就是参数 aaa是自己定义的
- modifiers:一个包含修饰符的对象例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }
注意: val
指令绑定值 只能是 vue实例下 data对象的数据 arg
参数是自己随便定义的
自定义指令语法简写
以上自定义指令语法 有些繁琐 vue.directive() 允许你传入一个函数 相当于 bind 和 update
// 注册 (指令函数)
Vue.directive('my-directive', function () {
// 这里将会被 `bind` 和 `update` 调用
})
实例
- 使用自定义指令做一个输入框自定聚焦
<div id="app">
<input v-focus type="" name="" id="" value="" />
</div>
Vue.directive('focus',{
//被绑定元素插入DOM时触发
inserted:function(el){
el.focus()
}
})
new Vue({
el:'#app',
})
- 使用自定义指令做元素拖拽
<div id="app">
<div class="box bgred lt0" v-drag></div>
<div class="box bgblue rt0" v-drag></div>
</div>
Vue.directive('drag',function(el){
el.onmousedown=function(e){
var w = e.clientX - el.offsetLeft
var h = e.clientY - el.offsetTop
document.onmousemove=function(e){
var x = e.clientX-w;
var y = e.clientY-h;
el.style.left=x+"px"
el.style.top=y+'px'
};
document.onmouseup=function(){
document.onmousemove=null;
document.onmouseup =null
}
}
})
var vm = new Vue({
el:'#app',
})
网友评论