Vue自定義指令介紹(2)
Vue指令
Vue的指令以v-開頭,作用在HTML元素上,將指令綁定在元素上,給綁定的元素添加一些特殊行為。
例如:
<h1 v-if="yes">Yes</h1>
其中,v-是Vue的標(biāo)識(shí),if是指令I(lǐng)D,yes是expression。yes是MVVM中的VM即ViewModel,當(dāng)它的值發(fā)生變化,就會(huì)觸發(fā)指令,改變View視圖的顯示。
expression還可以使用內(nèi)聯(lián)的模式,任何依賴的屬性發(fā)生變化時(shí)都會(huì)觸發(fā)指令的執(zhí)行。如:
<h1 v-if="'yes '+ user.name + ', ' + time"></h1>
可以使用逗號(hào)分割多重指令,如:
<div v-on="click:onClick, keyup:onKeyup, keydown:onKeydown"></div>
Vue自定義指令
自定義指令語法
Vue自定義指令語法如下:
Vue.directive(id, definition)
傳入的兩個(gè)參數(shù),id是指指令I(lǐng)D,definition是指定義對(duì)象。其中,定義對(duì)象可以提供一些鉤子函數(shù)。
鉤子函數(shù)
定義對(duì)象的鉤子函數(shù)如下:
鉤子函數(shù)參數(shù)
定義對(duì)象的鉤子函數(shù)參數(shù)如下:
el: 指令所綁定的元素,可以用來直接操作 DOM 。
binding: 一個(gè)對(duì)象,包含以下屬性:
name: 指令名,不包括 v- 前綴。
value: 指令的綁定值, 例如: v-my-directive="1 + 1",value 的值是 2。
oldValue: 指令綁定的前一個(gè)值,僅在 update 和 componentUpdated 鉤子中可用。無論值是否改變都可用。
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)。
oldVnode: 上一個(gè)虛擬節(jié)點(diǎn),僅在 update 和 componentUpdated 鉤子中可用。
使用例子
Vue自定義指令常見使用例子如下:
Vue.directive('my-directive', { bind: function(){ //做綁定的準(zhǔn)備工作 //比如添加事件監(jiān)聽器,或是其他只需要執(zhí)行一次的復(fù)雜操作 }, inserted: function(){ //... }, update: function(){ //根據(jù)獲得的新值執(zhí)行對(duì)應(yīng)的更新 //對(duì)于初始值也會(huì)調(diào)用一次 }, componentUpdated: function(){ //... }, unbind: function(){ //做清理操作 //比如移除bind時(shí)綁定的事件監(jiān)聽器 } })
當(dāng)指令的定義對(duì)象中只使用update時(shí),只需直接傳入函數(shù)即可,如下:
Vue.directive('my-directive', function(){ //... })
一個(gè)簡單示例
下面將講解一個(gè)簡單的例子,當(dāng)頁面加載時(shí),input輸入框?qū)⒆詣?dòng)聚焦。
代碼如下:
<!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> //注冊(cè)一個(gè)全局自定義指令v-focus Vue.directive('focus', { // 當(dāng)綁定元素插入到DOM中 inserted: function (el) { // 聚焦元素 el.focus() } }); var app = new Vue({ el: '#app' }); </script> </body> </html>
運(yùn)行截圖:
使用鉤子函數(shù)參數(shù)的例子
下面將講解一個(gè)使用鉤子函數(shù)參數(shù)的例子,將元素的字體色設(shè)置為#fff,將背景色設(shè)置為傳入指令的參數(shù)red,并將指令名,指令綁定值,指令綁定值的表達(dá)式,傳入指令的參數(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>' + '指令綁定表達(dá)式expression - ' + binding.expression + '<br>' + '傳入指令的參數(shù)argument - ' + binding.arg + '<br>' }, }); var demo = new Vue({ el: '#hook-arguments-example', data: { message: 'hello!' } }) </script> </body> </html>
運(yùn)行截圖:
對(duì)象字面量
同一個(gè)特性內(nèi)部,逗號(hào)分隔的多個(gè)從句被綁定為多個(gè)指令實(shí)例。如,下例中指令被創(chuàng)建和調(diào)用了兩次:
<div v-demo="color: 'white', text: 'hello'"></div>
如果指令需要多個(gè)值,可以傳入一個(gè)JavaScript對(duì)象字面量。如:
<!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>
運(yùn)行截圖:
字面指令
若在創(chuàng)建自定義指令時(shí),設(shè)置isLiterral: true,則特性值被視作字符串,并賦給該指令的expression,字面指令不會(huì)建立數(shù)據(jù)監(jiān)視。
參考鏈接
Vue.js教程 (2) : 指令 Directives
Vue.JS入門篇–自定義指令
vue.js筆記——指令
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vux+Axios攔截器增加loading的問題及實(shí)現(xiàn)方法
這篇文章主要介紹了Vux+Axios攔截器增加loading的問題及實(shí)現(xiàn)方法,文中通過實(shí)例代碼介紹了vue中使用axios的相關(guān)知識(shí),需要的朋友可以參考下2018-11-11vue頁面渲染數(shù)組中數(shù)據(jù)文案后添加逗號(hào)最后不加
這篇文章主要為大家介紹了vue頁面渲染數(shù)組中數(shù)據(jù)文案后添加逗號(hào)最后不加逗號(hào)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08vue使用JSEncrypt對(duì)密碼本地存儲(chǔ)時(shí)加解密的實(shí)現(xiàn)
本文主要介紹了vue使用JSEncrypt對(duì)密碼本地存儲(chǔ)時(shí)加解密,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07vue實(shí)現(xiàn)盒子內(nèi)拖動(dòng)方塊移動(dòng)的示例代碼
這篇文章主要給大家介紹了如何通過vue實(shí)現(xiàn)盒子內(nèi)拖動(dòng)方塊移動(dòng),文章通過代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以參考閱讀本文2023-08-08解決echarts echarts數(shù)據(jù)動(dòng)態(tài)更新和dataZoom被重置問題
這篇文章主要介紹了解決echarts echarts數(shù)據(jù)動(dòng)態(tài)更新和dataZoom被重置問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07SyntaxError:?/xx.vue:?Unexpected?token,?expected?“,“錯(cuò)誤解
這篇文章主要為大家介紹了SyntaxError:?/xx.vue:?Unexpected?token,?expected?“,“錯(cuò)誤解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08vue單行文本溢出會(huì)出現(xiàn)title提示自定義指令
這篇文章主要為大家介紹了vue單行文本溢出會(huì)出現(xiàn)title提示自定義指令,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01