vue中自定義指令(directive)的基本使用方法
前言
在vue項(xiàng)目中我們經(jīng)常使用到 v-show ,v-if,v-for等內(nèi)置的指令,除此之外vue還提供了非常方便的自定義指令,供我們對普通的dom元素進(jìn)行底層的操作。使我們的日常開發(fā)變得更加方便快捷。本文就來總結(jié)一下自定義指令的使用方法及常用的場景。
正文
1.全局注冊
這里全局注冊一個(gè)指令,用于使用該指令的元素加一個(gè)紅色邊框,通過指令操作樣式。
<div id="app">
<h1 type="text" v-red>我是h1元素</h1>
<div v-red>我是div元素</div>
<p v-red>我是p元素</p><br>
<input type="text" v-red><br>
</div>
<script>
Vue.directive("red", {
// 指令的定義
inserted: function (el) {
console.log(111);
el.style.border = "1px solid red"
}
})
new Vue({
el: "#app",
data() {
return {
}
},
methods: {
}
})
</script>
運(yùn)行結(jié)果如下:

上面的代碼中通過 Vue.directive 方法注冊了一個(gè)全局的指令,該函數(shù)接收兩個(gè)參數(shù),第一個(gè)參數(shù)為指令名稱,在元素中通過 " v-名稱 " 綁定元素,第二個(gè)參數(shù)為對綁定元素進(jìn)行處理的鉤子函數(shù),后面會有詳細(xì)介紹。
2.局部注冊
和全局注冊指令基本一樣,只是作用范圍不同而已,這里在組件內(nèi)部注冊一個(gè)自定義指令用于給組件內(nèi)部的綁定元素設(shè)置藍(lán)色邊框。
<div id="app">
<border-item></border-item>
</div>
<script>
Vue.directive("red", {
// 指令的定義
inserted: function (el) {
console.log(111);
el.style.border = "1px solid red"
}
})
// 定義子組件
Vue.component("border-item", {
directives: {
blue: {
// 指令的定義
inserted: function (el) {
el.style.border = "1px solid blue"
}
}
},
template: `<div>
<h1 v-blue>我是子組件h1元素</h1>
<div v-blue>我是子組件div元素</div>
<p v-blue>我是子組件p元素</p><br>
子組件<input type="text" v-blue><br>
<p v-blue>我是子組件h1元素,我同時(shí)使用了全局和局部自定義指令</p>
</div>`
})
new Vue({
el: "#app",
data() {
return {
}
},
methods: {
}
})
</script>
運(yùn)行結(jié)果如下:

通過上面的代碼,在子組件內(nèi)部通過 directives 對象注冊了一個(gè)給綁定元素設(shè)置藍(lán)色邊框的組件,該對象中傳入鍵值對,其中鍵表示指令名稱,通過" v-名稱 "使用,其值對應(yīng)一個(gè)對象,對象內(nèi)部為指令的相關(guān)鉤子函數(shù)。后面詳解鉤子函數(shù)。
注意:當(dāng)同一個(gè)元素及使用了全局指令和局部指令對統(tǒng)一屬性進(jìn)行操作的時(shí)候,會優(yōu)先使用局部自定義指令,這里采用就近原則,局部指令會優(yōu)先于全局指令對統(tǒng)一屬性操作的調(diào)用。
3.鉤子函數(shù)及參數(shù)設(shè)置
看了上面的介紹我們值都了directive的用法,但是里面的鉤子函數(shù)還需要清楚,只有明白了鉤子函數(shù)的調(diào)用時(shí)機(jī),才能定義出更加完美的指令。
一個(gè)指令定義對象可以提供如下幾個(gè)鉤子函數(shù)(均為可選):
* bind:只調(diào)用一次,指令第一次綁定到元素時(shí)調(diào)用。在這里可以進(jìn)行一次性的初始化設(shè)置。
* inserted:被綁定元素插入父節(jié)點(diǎn)時(shí)調(diào)用(僅保證父節(jié)點(diǎn)存在,但不一定已被插入文檔中)。
* update:所在組件的VNode更新時(shí)調(diào)用,但是可能發(fā)生在其子VNode更新之前。指令的值可能發(fā)生了改變,也可能沒有。但是你可以通過比較更新前后 的值來忽略不必要的模板更新(詳細(xì)的鉤子函數(shù)參數(shù)見下)。
* componentUpdated:指令所在組件的VNode及其子VNode全部更新后調(diào)用。
* unbind:只調(diào)用一次,指令與元素解綁時(shí)調(diào)用。
鉤子函數(shù)參數(shù)指令鉤子函數(shù)會被傳入以下參數(shù):
* el:指令所綁定的元素,可以用來直接操作DOM?! ?/p>
* binding:一個(gè)對象,包含以下property:
* name:指令名,不包括v-前綴?! ?/p>
* value:指令的綁定值,例如:v-my-directive="1+1"中,綁定值為2?! ?/p>
* oldValue:指令綁定的前一個(gè)值,僅在update和componentUpdated鉤子中可用。無論值是否改變都可用。
* expression:字符串形式的指令表達(dá)式。例如v-my-directive="1+1"中,表達(dá)式為"1+1"。
* arg:傳給指令的參數(shù),可選。例如v-my-directive:foo中,參數(shù)為"foo"?! ?/p>
* modifiers:一個(gè)包含修飾符的對象。例如:v-my-directive.foo.bar中,修飾符對象為{foo:true,bar:true}?! ?/p>
* vnode:Vue編譯生成的虛擬節(jié)點(diǎn)。
* oldVnode:上一個(gè)虛擬節(jié)點(diǎn),僅在update和componentUpdated鉤子中可用。
4.靈活用法
(1)動態(tài)指令參數(shù)
指令的參數(shù)可以是動態(tài)的。例如,在v-mydirective:[argument]="value"中,argument參數(shù)可以根據(jù)組件實(shí)例數(shù)據(jù)進(jìn)行更新!這使得自定義指令可以在應(yīng)用中被靈活使用。下面例子中分別設(shè)置指令實(shí)現(xiàn)元素的邊框綁定和元素的背景屬性綁定。
<div id="app">
<h1 v-border="redBorder">我是動態(tài)指令參數(shù)的元素1</h1>
<h1 v-color:[pro]="redBg">我是動態(tài)指令參數(shù)的元素2</h1>
</div>
<script>
Vue.directive("border", {
bind: function (el, binding, vnode) {
console.log("el", el);
console.log("binding", binding);
console.log("vnode", vnode);
el.style.border = binding.value
}
})
Vue.directive("color", {
bind: function (el, binding, vnode) {
console.log("el", el);
console.log("binding", binding);
console.log("vnode", vnode);
el.style[binding.arg] = binding.value
}
})
new Vue({
el: "#app",
data() {
return {
redBorder: "1px solid red",
pro: "backgroundColor",
redBg: "green"
}
},
methods: {
}
})
</script>
運(yùn)行結(jié)果如下:

順便看下打印的參數(shù):

上面的代碼中通過兩種方式介紹了動態(tài)參數(shù)自定義指令的方法,使用十分靈活,根據(jù)實(shí)際需要選擇合適的方式。
(2)函數(shù)簡寫方式
在很多時(shí)候,你可能想在bind和update時(shí)觸發(fā)相同行為,而不關(guān)心其它的鉤子。比如這樣寫:
Vue.directive("border",
function (el, binding, vnode) {
el.style.border = binding.value
}
)
(3)對象字面量方式
在綁定自定義指令的元素紅傳入一個(gè)對象的格式的數(shù)據(jù),然后在函數(shù)簡寫方式中使用。
<div id="app">
<h1 v-color="{ color: 'red', text: 'hello!' }">我是對象字面量形式</h1>
</div>
<script>
// 對象字面量
Vue.directive('color', function (el, binding) {
console.log(binding.value.color) // => "red"
console.log(binding.value.text) // => "hello!"
el.style.color = binding.value.color
el.innerHTML = binding.value.text
})
new Vue({
el: "#app",
data() {
return {
}
},
methods: {
}
})
</script>
運(yùn)行結(jié)果如下:

5.使用場景
除了上面的使用場景外,比如我們在項(xiàng)目中通過自定義指令來控制一個(gè)前端頁面的權(quán)限問題,在指令中設(shè)置一個(gè)參數(shù),當(dāng)頁面加載或者提交事件觸發(fā)的時(shí)候,首先執(zhí)行該自定義指令的事件,去請求校驗(yàn)是否有這個(gè)權(quán)限,做出相應(yīng)的操作。使用的地方還有好多,需要在項(xiàng)目中不斷練習(xí),可能有別的替代的方法而不被運(yùn)用,這就需要我們不斷去學(xué)習(xí)鞏固這些基礎(chǔ)知識,應(yīng)用最優(yōu)的解決方法去完成項(xiàng)目。
寫在最后
到此這篇關(guān)于vue中自定義指令(directive)的基本使用方法的文章就介紹到這了,更多相關(guān)vue自定義指令directive使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue監(jiān)聽使用方法和過濾器實(shí)現(xiàn)
這篇文章主要介紹了Vue監(jiān)聽使用方法和過濾器實(shí)現(xiàn),過濾器為頁面中數(shù)據(jù)進(jìn)行強(qiáng)化,具有局部過濾器和全局過濾器2022-06-06
Vue3?KeepAlive實(shí)現(xiàn)原理解析
KeepAlive?是一個(gè)內(nèi)置組件,那封裝一個(gè)組件對于大家來說應(yīng)該不會有太大的困難,它的核心邏輯在于它的?render?函數(shù),它用?map?去記錄要緩存的組件,就是?[key,vnode]?的形式,這篇文章主要介紹了Vue3?KeepAlive實(shí)現(xiàn)原理,需要的朋友可以參考下2022-09-09
Vue瀏覽器緩存sessionStorage+localStorage+Cookie區(qū)別解析
這篇文章主要介紹了Vue瀏覽器緩存sessionStorage+localStorage+Cookie區(qū)別解析,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
Vue利用computed解決單項(xiàng)數(shù)據(jù)流的問題
Vue是一個(gè)非常流行和強(qiáng)大的前端框架,它讓我們可以用簡潔和優(yōu)雅的方式來構(gòu)建用戶界面,但是,Vue也有一些需要注意和掌握的細(xì)節(jié)和技巧,今天我們來分享一個(gè)Vue中非常經(jīng)典的問題,也是一個(gè)非常實(shí)用的技巧,Vue利用computed解決單項(xiàng)數(shù)據(jù)流,需要的朋友可以參考下2023-08-08
Vue3解決Mockjs引入后并訪問404(Not Found) 的頁面報(bào)錯(cuò)問題
mock.js:是一款模擬數(shù)據(jù)生成器,可以生成隨機(jī)數(shù)據(jù),攔截 Ajax 請求,使用mockjs模擬后端接口,可隨機(jī)生成所需數(shù)據(jù),模擬對數(shù)據(jù)的增刪改查,本文給大家介紹了Vue3解決Mockjs引入后并訪問404(Not Found) 的頁面報(bào)錯(cuò)問題,需要的朋友可以參考下2025-04-04
Vue實(shí)現(xiàn)路由跳轉(zhuǎn)的3種方式超詳細(xì)分解
Vue.js是一款流行的前端JavaScript框架,它提供了多種方式來實(shí)現(xiàn)路由跳轉(zhuǎn),下面這篇文章主要給大家介紹了關(guān)于Vue實(shí)現(xiàn)路由跳轉(zhuǎn)的3種方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
vue+axios實(shí)現(xiàn)文件下載及vue中使用axios的實(shí)例
這篇文章主要介紹了vue+axios實(shí)現(xiàn)文件下載及vue中使用axios的實(shí)例,需要的朋友可以參考下2018-09-09

