就我們所知道的 v-if、v-model、v-show 等等......都是 Vue 幫我們制定好的功能,可是仍然有一些操作指令是 Vue 沒有提供的,不過Vue提供了自定義directive的屬性方法來滿足這一需求。其實,Vue Directive就是一種特殊的HTML元素屬性。
一種是全局註冊,在 Vue.directive 中定義組件的名字和相關指令操作。
Vue.directive('指令名', {
// 一些 option,提供許多 hook function 定義 directive 的具體操作
inserted: function(el) {
//指令插入元素後的操作
el.focus()
}
})
在對應組件的directives屬性裡註冊組件名,傳入指令的option對象。
var vm = new Vue({
el: "#app",
directives: {
name: { //指令的名字
// 指令的定義
}
}
})
自定義指提供了數個 Hook Function
,讓我們能使用 callback 在綁定元素的生命週期(directive 本身的生命週期)提供了不同階段做的事情。
hook | 作用 |
---|---|
bind | directive 第一次绑定到元素時調用,因此只會使用一次(初始化)。 |
inserted | 被绑定元素插入父節點時調用。 |
update | 綁定元素在模版更新時使用。 |
componentUpdated | 綁定元素在元件更新時使用。 |
unbind | 解除指令與元素的綁定。 |
Arguments | 作用 |
---|---|
el | directive 所绑定的元素,也就是想要操作的 DOM 物件。 |
binding | bind 的對象(傳的值或 function),下面還有詳細的介紹此參數的屬性。 |
vnode | 虛擬節點 (virtual DOM)。 |
unbind | 前一個虛擬節點,儘在 update 或 componentUpdated 時可用。 |
Binding 屬性:
屬性 | 作用 |
---|---|
name | 自定義指令名,不含前綴「v-」,如下例的「say」。 |
value | 指令的綁定值,如下例的「{"name":"Peter","prompt":"Hello World"}」。 |
oldValue | 綁定值的前一個值,儘在 update 或 componentUpdated 時可用。 |
expression | 前一個虛擬節點,儘在 update 或 componentUpdated 時可用。 |
arg | 傳給自定義指令的參數,如下例的「hello」。 |
modifiers | 修飾符,如下例的「a」、「b」、「c」。 |
如果需要傳入多個參數,可用物件的方式傳入。如下例的「{"name":"Peter","prompt":"Hello World"}
」。
範例:
<div id="app">
<span v-say:hello.a.b.c="{ name: 'Peter', prompt: message }"></span>
</div>
Vue.directive('say', {
bind: function(el, binding, vnode) {
var s = JSON.stringify;
el.innerHTML =
'name: ' + s(binding.name) + '<br>' +
'value: ' + s(binding.value) + '<br>' +
'expression: ' + s(binding.expression) + '<br>' +
'argument: ' + s(binding.arg) + '<br>' +
'modifiers: ' + s(binding.modifiers) + '<br>' +
'vnode keys: ' + Object.keys(vnode).join(', ');
}
});
var vm = new Vue({
el: '#app',
data: {
message: 'Hello World'
}
});
全域性方式的簡寫:Vue.directive( 指令名 , 函式 )。第二個引數(函式)會在指令 bind 和 update 的時候呼叫;
區域性指令的簡寫:directives:{ 指令名 : 函式 }。也是在指令 bind 和 update 的時候呼叫函式。具體見程式碼部分:
// fun 只會在 指令 的bind 和 update 呼叫
// 自定義全域性指令簡寫
Vue.directive("hello", function() {
console.log("呼叫全域性指令");
});
new Vue({
el: "#app",
data: {
msg: "訊息"
},
//自定義區域性指令簡寫
directives: {
world: function() {
console.log("區域性指令");
}
}
});
<div id="app">
<div v-hello>{{msg}}</div>
<div v-world>{{msg}}</div>
<input type="text" v-model="msg">
</div>
Vue.js—自定義指令
Vue.js: 自定義指令 Custom Directive
使用Vue Directive 封裝DOM 操作
Vue 官方文件
Vue.js - 重複使用 & 組裝的特性