Vue.js directive自定義指令詳解
自定義一個(gè)demo指令
Vue自定義指令語(yǔ)法如下:
Vue.directive(id, definition)
傳入的兩個(gè)參數(shù),id是指指令I(lǐng)D,definition是指定義對(duì)象。其中,定義對(duì)象可以提供一些鉤子函數(shù)。
<div id="app">
<!-- input輸入框獲得焦點(diǎn) -->
<input type="text" v-focus/>
</div>
<script>
// 注冊(cè)一個(gè)全局自定義指令 v-focus
Vue.directive("focus", {
// 當(dāng)綁定元素插入到 DOM 中。
inserted(el, binding) {
// 聚焦元素
el.focus();
}
})
</script>
<div id="app">
<p v-demo:red="msg">{{msg}}</p>
</div>
<script>
// 全局指令
Vue.directive('demo', function (el, binding) {
console.log(el) //p標(biāo)簽
console.log(binding) //輸出的是一個(gè)對(duì)象obj
console.log('指令名:'+binding.name)//指令名
console.log('指令的綁定值:'+binding.value)//指令的綁定值
console.log('綁定值的字符串形式:'+binding.expression) //綁定值的字符串形式
console.log('傳給指令的參數(shù):'+binding.arg)//傳給指令的參數(shù)
})
var vm = new Vue({
el: "#app",
data: {
msg: 'hello!'
},
// 局部指令
directives:{
demo:{
inserted: function (el) {
console.log(el)
}
}
}
})
</script>

對(duì)象字面量
<div id="app">
<p v-demo="colours">{{colours.text}}</p>
</div>
<script>
Vue.directive('demo', function (el, binding) {
console.log(el) // p標(biāo)簽
console.log(binding) // 輸出的是一個(gè)對(duì)象obj
console.log(binding.value) // {color: 'blue',text: 'hello!'}
console.log(binding.value.color) // 'blue'
console.log(binding.value.text) // 'hello!'
el.style = 'color:' + binding.value.color
})
var vm = new Vue({
el: "#app",
data: {
colours: {
color: 'blue',
text: 'hello!'
}
}
})
</script>
生命周期鉤子
指令定義函數(shù)提供了幾個(gè)鉤子函數(shù)(可選):
bind:只調(diào)用一次,指令第一次綁定到元素時(shí)調(diào)用,用這個(gè)鉤子函數(shù)可以定義一個(gè)綁定時(shí)執(zhí)行一次的初始化動(dòng)作。inserted:被綁定元素插入父節(jié)點(diǎn)(div#app)時(shí)調(diào)用(父節(jié)點(diǎn)存在即可調(diào)用,不必存在于document中)。update:當(dāng)綁定指令的元素(VNode-虛擬節(jié)點(diǎn))狀態(tài)發(fā)生改變時(shí)觸發(fā)(包括樣式、內(nèi)容、vue數(shù)據(jù)…)componentUpdated:指令所在的組件的VNode以及其子VNode 全部更新后調(diào)用。unbind:只調(diào)用一次,指令與元素解綁(元素從DOM中刪除)時(shí)調(diào)用。
<div id="app">
<p v-demo="color">{{num}}</p>
<button @click="add">增加</button>
<button onclick='unbind()'>解綁</button>
</div>
<script>
function unbind() {
vm.$destroy(); //另外起一個(gè)方法解綁
}
Vue.directive('demo', { //五個(gè)注冊(cè)指令的鉤子函數(shù)
bind: function () { //1.被綁定
//做綁定的準(zhǔn)備工作。比如添加事件監(jiān)聽(tīng)器,或是其他只需要執(zhí)行一次的復(fù)雜操作
console.log('1 - bind');
},
inserted: function () { //2.綁定到節(jié)點(diǎn)
console.log('2 - inserted');
},
update: function () { //3.組件更新
//根據(jù)獲得的新值執(zhí)行對(duì)應(yīng)的更新。對(duì)于初始值也會(huì)調(diào)用一次
console.log('3 - update');
},
componentUpdated: function () { //4.組件更新完成
console.log('4 - componentUpdated');
},
unbind: function () { //5.解綁
//做清理操作。比如移除bind時(shí)綁定的事件監(jiān)聽(tīng)器
console.log('5 - bind');
}
})
var vm = new Vue({
el: "#app",
data: {
num: 10,
color: 'red'
},
methods: {
add: function () {
this.num++;
}
}
})
</script>
初始化觸發(fā)方法1和2,點(diǎn)擊增加按鈕觸發(fā)方法3和4,點(diǎn)擊解綁按鈕觸發(fā)方法5,如下圖:

到此這篇關(guān)于Vue.js directive自定義指令詳解的文章就介紹到這了,更多相關(guān)Vue.js directive自定義指令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue-cli中vue本地實(shí)現(xiàn)跨域調(diào)試接口
這篇文章主要介紹了vue-cli中vue本地實(shí)現(xiàn)跨域調(diào)試接口,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
element組件el-date-picker禁用當(dāng)前時(shí)分秒之前的日期時(shí)間選擇
本文主要介紹了element組件el-date-picker禁用當(dāng)前時(shí)分秒之前的日期時(shí)間選擇,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
Vue數(shù)據(jù)驅(qū)動(dòng)模擬實(shí)現(xiàn)4
這篇文章主要介紹了Vue數(shù)據(jù)驅(qū)動(dòng)模擬實(shí)現(xiàn)的相關(guān)資料,介紹了Array的變異方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
vue中配置mint-ui報(bào)css錯(cuò)誤問(wèn)題的解決方法
本篇文章主要介紹了vue中配置mint-ui報(bào)css錯(cuò)誤問(wèn)題的解決方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-10-10
el-form表單驗(yàn)證的一些實(shí)用方法總結(jié)
表單校驗(yàn)是注冊(cè)環(huán)節(jié)中必不可少的操作,表單校驗(yàn)通過(guò)一定的規(guī)則來(lái)確保用戶(hù)提交數(shù)據(jù)的有效性,下面這篇文章主要給大家介紹了關(guān)于el-form表單驗(yàn)證的一些實(shí)用方法,需要的朋友可以參考下2023-01-01
vue2中前端實(shí)現(xiàn)語(yǔ)音播報(bào)的詳細(xì)過(guò)程
vue中語(yǔ)音播報(bào),目前本人寫(xiě)的過(guò)程中,遇到了兩種情況,第一種是后端直接返回一個(gè)mp3的播放url,第二種就是播報(bào)的內(nèi)容需要前端自己拼接的,關(guān)于兩種方法,我都說(shuō)一下如何實(shí)現(xiàn),感興趣的朋友一起看看吧2024-07-07

