理解vue自定義指令
阿新 • • 發佈:2020-11-23
基礎簡介
除了核心功能預設的內建指令(v-model和v-show),vue也允許註冊自定義指令。注意,在vue2.0中,程式碼複用和抽象的主要形式是元件,但是在有些情況下,我們需要對普通的DOM元素進行底層操作,這時候就需要我們用到自定義指令。
簡單事例,當頁面載入時元素就會獲得焦點,但是實際上只要我們程式碼完成,頁面沒開啟時這個輸入框已經是聚焦狀態:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<script src="Vue.min.js"></script>
</head>
<body>
<div id="app">
<input v-focus>
</div>
<script>
//註冊一個全域性自定義指令v-focus
Vue.directive('focus', {
// 當繫結元素插入到DOM中
inserted: function (el) {
// 聚焦元素
el.focus()
}
});
var app = new Vue({
el: '#app'
});
</script>
</body>
</html>
鉤子函式
我們可以使用Vue.directive的方法傳入執行id和定義物件來註冊一個全域性的自定義指令,一個指令物件可以提供幾個鉤子函式:
- bind:只調用一次,指令第一次繫結元素的時候呼叫,這時我們可以進行對它的一次性初始化設定。
- inserted,被繫結元素插入父節點時的呼叫。
- update,所在元件的 VNode 更新時呼叫,但是可能發生在元件的 VNode更新前,因此指令的值是不確定的,可能有也可能沒有。
- componentUpdated,指令所在元件的 VNode以及它之後的更新呼叫。
- unbind,只調用一次,指令與元素解綁時呼叫。
定義物件的鉤子函式引數有(除了el之外其他引數都是i只讀的)
- el:指令繫結的元素,可以被用來直接操作DOM。
- binding
- name:指令名,不包括 v- 字首。
- value:指令的繫結值,例如:v-new-xkd:"1+2";,繫結值為3。
- oldValue:指令繫結的前一個值,只在update 和 componentUpdated 鉤子中使用。
- expression:字串形式的指令表示式。例如上面 v-new-xkd中的"1+2"。
- arg:傳給指令的引數。
- modifiers:一個包含修飾符的物件。
- vnode:Vue 編譯生成的虛擬節點。
- oldVnode:上一個虛擬節點。
指令的引數可以是動態的。 自定義鉤子函式屬性屬性事例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<script src="Vue.min.js"></script>
</head>
<body>
<div id="hook" v-xkd:foo.a.b="message"></div>
<script>
// 使用自定義指令
Vue.directive('xkd', {
// 指令在繫結到元素要執行的操作
bind: function (el, binding, vnode) {
var w = JSON.stringify;
// 準備將傳遞來的引數顯示在呼叫該指令的元素的innerHTML上
el.innerHTML =
'name: ' + w(binding.name) + '<br><br>' +
'value: ' + w(binding.value) + '<br><br>' +
'expression: ' + w(binding.expression) + '<br><br>' +
'argument: ' + w(binding.arg) + '<br><br>' +
'modifiers: ' + w(binding.modifiers) + '<br><br>' +
'vnode keys: ' + Object.keys(vnode).join(', ')
}
})
// 建立自定義指令
new Vue({
el: '#hook',
data: {
message: '俠課島'
}
}) </script></body></html>
函式簡寫
大多數情況下,可能想在 bind 和 update 鉤子上做重複的動作,但是並不想關心其他鉤子函式的情況,我們可以這樣寫:
Vue.directive('func-abbr', function (el, binding) {
el.style.backgroundColor = binding.value
})
PPT模板下載大全https://www.wode007.com
物件字面量物件字面量
如果指令需要多個值,那麼可以傳入一個JavaScript物件字面量;同一個特性內部,逗號隔開的多個從句被繫結為多個指令例項。
<div id="hook" v-demo="{ color: 'green', text: 'Chivalrous Island!'}"></div>
<script>
Vue.directive('demo', function (el, binding) {
console.log(binding.value.color);
console.log(binding.value.text);
})
// 建立自定義指令
new Vue({
el: '#hook',
data: {
message: '俠課島'
}
})
</script>