vue全局自定義指令和局部自定義指令的使用
除了默認(rèn)設(shè)置的核心指令 (v-model 和 v-show),Vue 也允許注冊(cè)自定義指令。
局部自定義指令(只針對(duì)組件內(nèi)的元素)
父組件app.vue
<template>
<div id="app">
<test-api></test-api>
</div>
</template>
<script>
import testApi from './components/testApi.vue'
export default {
data (){
return {
}
},
watch:{
},
methods:{
},
components:{
testApi
}
}
</script>
<style >
</style>
子組件testApi.vue
<template>
<div>
<!-- 讓input元素在打開(kāi)頁(yè)面的時(shí)候就獲得焦點(diǎn) -->
<input type="text" v-autoFocus >
</div>
</template>
<script>
export default {
directives:{
// 自定義指令的名字
autoFocus:{
// 鉤子函數(shù),被綁定元素插入父節(jié)點(diǎn)時(shí)調(diào)用 (父節(jié)點(diǎn)存在即可調(diào)用,不必存在于 document 中)。
inserted(el){
el.focus()
console.log( 'inserted' );
},
// 只調(diào)用一次,指令第一次綁定到元素時(shí)調(diào)用,用這個(gè)鉤子函數(shù)可以定義一個(gè)在綁定時(shí)執(zhí)行一次的初始化動(dòng)作。
bind(){
console.log( 'bind' );
},
// 所在組件的 VNode 更新時(shí)調(diào)用,但是可能發(fā)生在其孩子的 VNode 更新之前。
// 指令的值可能發(fā)生了改變也可能沒(méi)有。但是你可以通過(guò)比較更新前后的值來(lái)忽略不必要的模板更新
update(){
console.log( 'update' );
},
// 所在組件的 VNode 及其孩子的 VNode 全部更新時(shí)調(diào)用。
componentUpdated(){
console.log( 'componentUpdated' );
},
// 只調(diào)用一次,指令與元素解綁時(shí)調(diào)用。
unbind(){
console.log( 'unbind' );
}
}
},
data () {
return {
}
},
props:[],
methods:{
},
created(){
},
mounted(){
},
components:{
}
}
</script>
<style scoped>
</style>
效果圖:

定義全局自定義指令
在任意頁(yè)面的任意input里加上v-autoFcs
Vue.directive('autoFcs',{
// 鉤子函數(shù),被綁定元素插入父節(jié)點(diǎn)時(shí)調(diào)用 (父節(jié)點(diǎn)存在即可調(diào)用,不必存在于 document 中)。
inserted(el){
el.focus()
console.log( 'inserted' );
},
// 只調(diào)用一次,指令第一次綁定到元素時(shí)調(diào)用,用這個(gè)鉤子函數(shù)可以定義一個(gè)在綁定時(shí)執(zhí)行一次的初始化動(dòng)作。
bind(){
console.log( 'bind' );
},
// 所在組件的 VNode 更新時(shí)調(diào)用,但是可能發(fā)生在其孩子的 VNode 更新之前。
// 指令的值可能發(fā)生了改變也可能沒(méi)有。但是你可以通過(guò)比較更新前后的值來(lái)忽略不必要的模板更新
update(){
console.log( 'update' );
},
// 所在組件的 VNode 及其孩子的 VNode 全部更新時(shí)調(diào)用。
componentUpdated(){
console.log( 'componentUpdated' );
},
// 只調(diào)用一次,指令與元素解綁時(shí)調(diào)用。
unbind(){
console.log( 'unbind' );
}
})
效果圖:

自定義指令的鉤子函數(shù)
指令定義函數(shù)提供了幾個(gè)鉤子函數(shù) (可選):
bind:只調(diào)用一次,指令第一次綁定到元素時(shí)調(diào)用,用這個(gè)鉤子函數(shù)可以定義一個(gè)在綁定時(shí)執(zhí)行一次的初始化動(dòng)作。inserted:被綁定元素插入父節(jié)點(diǎn)時(shí)調(diào)用 (父節(jié)點(diǎn)存在即可調(diào)用,不必存在于 document 中)。update:所在組件的 VNode 更新時(shí)調(diào)用,但是可能發(fā)生在其孩子的 VNode 更新之前。指令的值可能發(fā)生了改變也可能沒(méi)有。但是你可以通過(guò)比較更新前后的值來(lái)忽略不必要的模板更新 (詳細(xì)的鉤子函數(shù)參數(shù)見(jiàn)下)。componentUpdated:所在組件的 VNode 及其孩子的 VNode 全部更新時(shí)調(diào)用。unbind:只調(diào)用一次,指令與元素解綁時(shí)調(diào)用。
接下來(lái)我們來(lái)看一下鉤子函數(shù)的參數(shù) (包括el,binding,vnode,oldVnode)。
自定義指令鉤子函數(shù)的參數(shù)
鉤子函數(shù)被賦予了以下參數(shù):
el:指令所綁定的元素,可以用來(lái)直接操作 DOM 。binding:一個(gè)對(duì)象,包含以下屬性:name:指令名,不包括v-前綴。value:指令的綁定值,例如:v-my-directive=“1 + 1”, value 的值是2。oldValue:指令綁定的前一個(gè)值,僅在update和componentUpdated鉤子中可用。無(wú)論值是否改變都可用。expression:綁定值的字符串形式。例如v-my-directive=“1 + 1”,expression 的值是"1 + 1"。arg:傳給指令的參數(shù)。例如v-my-directive:foo,arg 的值是"foo"。modifiers:一個(gè)包含修飾符的對(duì)象。例如:v-my-directive.foo.bar, 修飾符對(duì)象 modifiers 的值是{ foo: true, bar: true }。vnode:Vue 編譯生成的虛擬節(jié)點(diǎn),查閱 VNode API 了解更多詳情。oldVnode:上一個(gè)虛擬節(jié)點(diǎn),僅在update和componentUpdated鉤子中可用。
例子
<div id="hook-arguments-example" v-demo:foo.a.b="message"></div>
Vue.directive('demo', {
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(', ')
}
})
new Vue({
el: '#hook-arguments-example',
data: {
message: 'hello!'
}
})

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Vue3實(shí)現(xiàn)全局loading指令的示例詳解
- vue全局注冊(cè)自定義指令防抖解析
- Vue全局自定義指令Modal拖拽的實(shí)踐
- vue全局自定義指令-元素拖拽的實(shí)現(xiàn)代碼
- vue directive定義全局和局部指令及指令簡(jiǎn)寫
- 對(duì)Vue2 自定義全局指令Vue.directive和指令的生命周期介紹
- vue3的自定義指令directives實(shí)現(xiàn)
- vue 自定義指令directives及其常用鉤子函數(shù)說(shuō)明
- vue?filters和directives訪問(wèn)this的問(wèn)題詳解
- vue通過(guò)指令(directives)實(shí)現(xiàn)點(diǎn)擊空白處收起下拉框
- 詳解vue + vuex + directives實(shí)現(xiàn)權(quán)限按鈕的思路
- vue全局指令文件?directives詳解
相關(guān)文章
vue實(shí)現(xiàn)一個(gè)矩形標(biāo)記區(qū)域(rectangle marker)的方法
這篇文章主要介紹了vue實(shí)現(xiàn)一個(gè)矩形標(biāo)記區(qū)域 rectangle marker的方法,幫助大家實(shí)現(xiàn)區(qū)域標(biāo)記功能,感興趣的朋友可以了解下2020-10-10
詳解vue與后端數(shù)據(jù)交互(ajax):vue-resource
本篇文章主要介紹了詳解vue與后端數(shù)據(jù)交互(ajax):vue-resource,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
vue3利用v-model實(shí)現(xiàn)父子組件之間數(shù)據(jù)同步的代碼詳解
在Vue 3中,v-model這一指令也得到了升級(jí),使得父子組件之間的數(shù)據(jù)同步變得更加容易和靈活,本文將探討一下Vue 3中如何利用v-model來(lái)實(shí)現(xiàn)父子組件之間的數(shù)據(jù)同步,需要的朋友可以參考下2024-03-03
Vue實(shí)現(xiàn)生成本地Json文件功能方式
這篇文章主要介紹了Vue實(shí)現(xiàn)生成本地Json文件功能方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
VUE項(xiàng)目啟動(dòng)沒(méi)有問(wèn)題但代碼中script標(biāo)簽有藍(lán)色波浪線標(biāo)注
這篇文章主要給大家介紹了關(guān)于VUE項(xiàng)目啟動(dòng)沒(méi)有問(wèn)題但代碼中script標(biāo)簽有藍(lán)色波浪線標(biāo)注的相關(guān)資料,文中將遇到的問(wèn)題以及解決的方法介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
在Vue+Ts+Vite項(xiàng)目中配置別名指向不同的目錄并引用的案例詳解
這篇文章主要介紹了在Vue+Ts+Vite項(xiàng)目中配置別名指向不同的目錄并引用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
Vue實(shí)現(xiàn)數(shù)字時(shí)鐘效果
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)數(shù)字時(shí)鐘效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
Vue ElementUI this.$confirm async await封
這篇文章主要介紹了Vue ElementUI this.$confirm async await封裝方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09

