Vue自定義指令介紹(2)
Vue指令
Vue的指令以v-開頭,作用在HTML元素上,將指令綁定在元素上,給綁定的元素添加一些特殊行為。
例如:
<h1 v-if="yes">Yes</h1>
其中,v-是Vue的標識,if是指令ID,yes是expression。yes是MVVM中的VM即ViewModel,當它的值發(fā)生變化,就會觸發(fā)指令,改變View視圖的顯示。
expression還可以使用內(nèi)聯(lián)的模式,任何依賴的屬性發(fā)生變化時都會觸發(fā)指令的執(zhí)行。如:
<h1 v-if="'yes '+ user.name + ', ' + time"></h1>
可以使用逗號分割多重指令,如:
<div v-on="click:onClick, keyup:onKeyup, keydown:onKeydown"></div>
Vue自定義指令
自定義指令語法
Vue自定義指令語法如下:
Vue.directive(id, definition)
傳入的兩個參數(shù),id是指指令ID,definition是指定義對象。其中,定義對象可以提供一些鉤子函數(shù)。
鉤子函數(shù)
定義對象的鉤子函數(shù)如下:

鉤子函數(shù)參數(shù)
定義對象的鉤子函數(shù)參數(shù)如下:
el: 指令所綁定的元素,可以用來直接操作 DOM 。
binding: 一個對象,包含以下屬性:
name: 指令名,不包括 v- 前綴。
value: 指令的綁定值, 例如: v-my-directive="1 + 1",value 的值是 2。
oldValue: 指令綁定的前一個值,僅在 update 和 componentUpdated 鉤子中可用。無論值是否改變都可用。
expression: 綁定值的字符串形式。 例如 v-my-directive="1 + 1" , expression 的值是 "1 + 1"。
arg: 傳給指令的參數(shù)。例如 v-my-directive:foo, arg 的值是 "foo"。
modifiers: 一個包含修飾符的對象。 例如: v-my-directive.foo.bar, 修飾符對象 modifiers 的值是 { foo: true, bar: true }。
vnode: Vue 編譯生成的虛擬節(jié)點。
oldVnode: 上一個虛擬節(jié)點,僅在 update 和 componentUpdated 鉤子中可用。
使用例子
Vue自定義指令常見使用例子如下:
Vue.directive('my-directive', {
bind: function(){
//做綁定的準備工作
//比如添加事件監(jiān)聽器,或是其他只需要執(zhí)行一次的復雜操作
},
inserted: function(){
//...
},
update: function(){
//根據(jù)獲得的新值執(zhí)行對應的更新
//對于初始值也會調(diào)用一次
},
componentUpdated: function(){
//...
},
unbind: function(){
//做清理操作
//比如移除bind時綁定的事件監(jiān)聽器
}
})
當指令的定義對象中只使用update時,只需直接傳入函數(shù)即可,如下:
Vue.directive('my-directive', function(){
//...
})
一個簡單示例
下面將講解一個簡單的例子,當頁面加載時,input輸入框?qū)⒆詣泳劢埂?
代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<script src="https://unpkg.com/vue/dist/vue.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>
運行截圖:

使用鉤子函數(shù)參數(shù)的例子
下面將講解一個使用鉤子函數(shù)參數(shù)的例子,將元素的字體色設置為#fff,將背景色設置為傳入指令的參數(shù)red,并將指令名,指令綁定值,指令綁定值的表達式,傳入指令的參數(shù)顯示在<div>中。
代碼如下:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="utf-8">
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="hook-arguments-example" v-demo-directive:red="message"></div>
<script>
Vue.directive('demoDirective', {
bind: function(el, binding, vnode){
el.style.color = '#fff'
el.style.backgroundColor = binding.arg
el.innerHTML =
'指令名name - ' + binding.name + '<br>' +
'指令綁定值value - ' + binding.value + '<br>' +
'指令綁定表達式expression - ' + binding.expression + '<br>' +
'傳入指令的參數(shù)argument - ' + binding.arg + '<br>'
},
});
var demo = new Vue({
el: '#hook-arguments-example',
data: {
message: 'hello!'
}
})
</script>
</body>
</html>
運行截圖:

對象字面量
同一個特性內(nèi)部,逗號分隔的多個從句被綁定為多個指令實例。如,下例中指令被創(chuàng)建和調(diào)用了兩次:
<div v-demo="color: 'white', text: 'hello'"></div>
如果指令需要多個值,可以傳入一個JavaScript對象字面量。如:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="hook-arguments-example" v-demo-directive="{ color: 'white', text: 'hello!' }"></div>
<script>
Vue.directive('demoDirective', function(el, binding, vnode){
console.log(binding.value.color);
console.log(binding.value.text);
});
var demo = new Vue({
el: '#hook-arguments-example'
})
</script>
</body>
</html>
運行截圖:

字面指令
若在創(chuàng)建自定義指令時,設置isLiterral: true,則特性值被視作字符串,并賦給該指令的expression,字面指令不會建立數(shù)據(jù)監(jiān)視。
參考鏈接
Vue.js教程 (2) : 指令 Directives
Vue.JS入門篇–自定義指令
vue.js筆記——指令
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vux+Axios攔截器增加loading的問題及實現(xiàn)方法
這篇文章主要介紹了Vux+Axios攔截器增加loading的問題及實現(xiàn)方法,文中通過實例代碼介紹了vue中使用axios的相關(guān)知識,需要的朋友可以參考下2018-11-11
vue頁面渲染數(shù)組中數(shù)據(jù)文案后添加逗號最后不加
這篇文章主要為大家介紹了vue頁面渲染數(shù)組中數(shù)據(jù)文案后添加逗號最后不加逗號示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
vue使用JSEncrypt對密碼本地存儲時加解密的實現(xiàn)
本文主要介紹了vue使用JSEncrypt對密碼本地存儲時加解密,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07
vue實現(xiàn)盒子內(nèi)拖動方塊移動的示例代碼
這篇文章主要給大家介紹了如何通過vue實現(xiàn)盒子內(nèi)拖動方塊移動,文章通過代碼示例講解的非常詳細,具有一定的參考價值,感興趣的小伙伴可以參考閱讀本文2023-08-08
解決echarts echarts數(shù)據(jù)動態(tài)更新和dataZoom被重置問題
這篇文章主要介紹了解決echarts echarts數(shù)據(jù)動態(tài)更新和dataZoom被重置問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
SyntaxError:?/xx.vue:?Unexpected?token,?expected?“,“錯誤解
這篇文章主要為大家介紹了SyntaxError:?/xx.vue:?Unexpected?token,?expected?“,“錯誤解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
vue單行文本溢出會出現(xiàn)title提示自定義指令
這篇文章主要為大家介紹了vue單行文本溢出會出現(xiàn)title提示自定義指令,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01

