v-directive自定義構造器
介紹:
注冊或獲取全局指令。
平時大家在用vue開發項目的時候大多會用到一些官方指令,例如:
v-for/v-if/v-else/v-else-if/v-model/v-bind/v-on/v-show/v-html/v-text...
但這些指令只能完成一部分功能,大部分功能是需要我們自己來書寫的,所以我們就會用到自定義指令來幫助我們注冊自己想要的功能。
自定義指令分為兩種,一種是局部變量,一種是全局變量,我們先來看看局部變量:
當我們想實現這樣一個功能,點擊彈框,我們會用v-on:click這個指令,那如果我們想讓一個指令,加上之后字體就會變色,我們就可以自己注冊指令:
<template>
<div id="app">
<button @click="onclick" v-show="ok">
Hello
</button>
<div v-color>哈哈哈</div>
</div>
</template>
<script>
export default {
data: () => {
return {
}
},
methods: {
onclick: function() {
alert("666");
}
},
directives:{
'color':{
bind:function(el,binding){
el.style.color = 'red';
},
inserted:function(el){
el.style.display = 'block';
}
}
}
}
</script>
<style>
</style>
將以上代碼打開后,我們就可以發現 ‘哈哈哈’ 三個字已經變成了紅色,所以注冊一個局部自定義指令的方法我們可以得到:
directives:{
'color':{//給字體設置顏色
bind:function(el){
el.style.color="red";
}
}
}
bind:function(el,binding,vnode)這里面有三個參數,他們分別代表的意思是:
el:你要調用的該元素,打印一下會直接打印出DOM節點
binding:一個對象,它包含了:
name:指令名,不包括 v- 前綴value:指令綁定的值,例如:v-count="1 + 1"中,綁定值為 2expression:字符串形式的指令表達式。例如:v-count="1 + 1"中,表達式 為 1 + 1oldValue:指令綁定的前一個值,僅在 update 和 componentUpdated 鈎子中可用。無論值是否改變都可用。- arg:` 傳給指令的參數,可選。例如 v-my-directive:foo 中,參數為 “foo”
modifiers:一個包含修飾符的對象。例如:v-my-directive.foo.bar 中,修飾符對象為{ foo: true, bar: true }
vnode:Vue編譯生成的虛擬節點
oldvnode: 上一個虛擬節點,僅在 update 和 componentUpdated 鈎子中可用
然后如果我們想將一個指令注冊為全局指令的話,我們可以將代碼寫到main.js里面,或者新建一個index.js文件,然后在main.js里面import引入,再use()一下,不過要注意注冊為全局變量的話代碼需要改變一下,例如上邊的局部指令,改為全局的話代碼應為:
Vue.directive('none',{
bind:function(el,binding,vnode){
el.style.display = 'none';
}
})
然后自定義指令還有個生命周期:
inserted : 表示元素 插入到DOM中的時候,會執行 inserted 函數,觸發一次。(例如:自動獲取焦點)。
updated : 當VNode 更新的時候,會執行 updated 函數,可能會觸發多次。
componentUpdated : 指令所在組件的VNode 及其子 VNode 全部更新后調用。
upbind: 只調用一次,指令與元素解綁時調用。
