自定义指令
自定义指令底层和内置指令实际就是操作真实的DOM元素,实现功能操作。
1. 语法
- 局部指令
js
new Vue({ new Vue({
directives:{指令名:配置对象} 或 directives(){ }
}) })
- 全局指令
js
Vue.directive(:{指令名:配置对象}) 或 Vue.directive(:{指令名,回调函数})
2. 常用的三个回调函数
配置对象中有三个常用的回调函数:
- bind:指令与元素绑定时调用,里面的this指向window
- inserted: 指令所在元素被插入页面时被调用,里面的this指向window
- update: 指令所在模版结构被重新解析时调用,里面的this指向window
备注
- 指令定义时不加v- , 但使用时要加v-
- 指令名如果是多个单词,要使用kebab-case命名方式,不要用cameCase命令。
值得一提的是使用v-其实本身就说明vue遵守了kebab-case命名
html
<!--需求1: 定义v-big指令,和v-text功能类似,但会把绑定的数值放大10倍-->
<!--需求1: 定义v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点。-->
<div id="editor">
<div v-text="n"></div>
<div v-big="n"></div>
<button v-on:click="n++">n+1</button>
<hr/>
<input v-fbind:value="n">
</div>
js
Vue.config.productionTip = false
const vm = new Vue({
el: "#editor",
data() {
return {
n: 1
}
},
directives: {
// big何时被调用? 1.指令与元素成功绑定时(一上来)2.指令所在的模版重新被解析时
big(element, binding) { // element指令所在的元素, binding绑定的相关信息对象
console.log(element instanceof HTMLElement)
element.innerHTML = binding.value * 10
},
/**
* 这里的focus不奏效,是因为指令与元素成功绑定时是在内存中虚拟DOM绑定的,而不是挂载到页面之后,
* focus只对在页面上真实DOM才有效; 而在第二次调用时input元素已经在页面上了,所以起作用了
* */
// fbind(element, binding){
// element.value = binding.value
// element.focus()
// } 不奏效
// 使用自定义指令第二种方式
fbind: {
// 指令与元素成功绑定时(一上来)
bind(element, binding){
element.value = binding.value
},
// 指令所在元素插入页面时
inserted(element, binding){
element.focus()
},
// 指令所在的模版重新被解析时
update(element, binding){
element.value = binding.value
}
}
}
})