Vue自定义指令
先来了解一下vue的内置指令(v-开头的是指令):v-if、v-else、v-show、v-for、v-once、v-model、 v-on(@)、v-bind(:)、v-text、v-html等。
自定义指令directives,和内置指令的区别,directives主要是需要对普通dom元素进行操作时,就需要用到自定义指令。
(vue使用自定义指令操作底层dom,原生js用document.getElementById()来操作真实dom。vue的指令相比原生提高了性能,它选择操控内存vDom虚拟对象,建立数据和视图之间的联系,数据驱动去更改视图渲染。 )
directives的用法:
1.注册一个全局自定义指令
第一个参数:指令名称(起个名,不带v-)。第二个参数是个对象,提供了自定义钩子函数inserted(下面还有其他的函数),el是这个钩子函数的参数(下面还有其他的参数),当这个指令绑定了元素的时候,代表拿到这个元素的真实DOM了,然后给他添加方法。
<div id="box">
<input id="input" type="text" v-focus>
</div>
//全局注册自定义指令钩子:v-focus
Vue.directive("focus",{
//当被绑定元素插入到父节点的时候,就会触发inserted钩子函数
inserted(el){
el.focus()
}
})
2.注册一个局部自定义指令
特点:局部自定义指令directives,加s
new Vue({
el:"#box",
directives:{
focus:{
inserted(el){
el.focus()
}
}
}
})
自定义钩子函数
自定义指令第二个参数是个对象,里面提供了几种自定义钩子函数。
bind:只调用一次,指令第一次绑定到元素时调用。用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
inserted:被绑定元素插入父节点时调用(父节点存在即可调用)。
update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新
componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
unbind:只调用一次, 指令与元素解绑时调用。
钩子函数参数(常用el和binding)
el:指令所绑定的元素,可以用来直接操作 DOM 。
binding:一个对象,包含以下属性(常用value参数,解析传来的数据)
- name:指令名,不包含v-的前缀;
- value:指令的绑定值;例如:v-my-directive=“1+1”,value的值是2,binding.value拿到解析变量后的数据;
- oldValue:指令绑定的前一个值,仅在update和componentUpdated钩子函数中可用,无论值是否改变都可用;
- expression:绑定值的字符串形式;例如:v-my-directive=“1+1”,expression的值是’1+1’;
- arg:传给指令的参数;例如:v-my-directive:foo,arg的值为 ‘foo’;
- modifiers:一个包含修饰符的对象;例如:v-my-directive.a.b,modifiers的值为{‘a’:true,‘b’:true}
vnode:Vue编译的生成虚拟节点;
oldVnode:上一次的虚拟节点,仅在update和componentUpdated钩子函数中可用。
简单案例
<div id="app">
<!--一个双引号括起来的是变量"red",潜逃一个单引号的是字符串"'pink'",变量没定义会报错-->
<p v-color="'pink'">pink</p>
<p v-color="red">pink</p>
<p v-color="orange">我是橙色</p>
{{orange}}
<!--这里如果用bind绑定,那么单击后颜色不改变,所以数据改变更新,调用update-->
<button @click="orange='green'">点击更改橙色</button>
</div>
Vue.directive("color",{
bind(el,binding){ //注意了,bind只是初始化调用一次
el.style.background = binding.value
},
//点击改变时,数据改变更新,调用update
update(el,binding){
el.style.background = binding.value
}
})
new Vue({
el: '#app',
data:{
red:"red",
orange:"orange"
}
})
简写逻辑相同的钩子函数
Vue.directive('color', function (el, binding) {
el.style.backgroundColor = binding.value
})