Vue.directive使用注意(小結(jié))
指令鉤子函數(shù)會(huì)被傳入以下參數(shù):
- el:指令所綁定的元素,可以用來(lái)直接操作 DOM 。
- binding:一個(gè)對(duì)象,包含以下屬性:vnode:Vue 編譯生成的虛擬節(jié)點(diǎn)。移步 VNode API 來(lái)了解更多詳情。
- ◦name:指令名,不包括 v- 前綴。
- ◦value:指令的綁定值,例如:v-my-directive="1 + 1" 中,綁定值為 2。
- ◦oldValue:指令綁定的前一個(gè)值,僅在 update 和 componentUpdated 鉤子中可用。無(wú)論值是否改變都可用。
- ◦expression:字符串形式的指令表達(dá)式。例如 v-my-directive="1 + 1" 中,表達(dá)式為 "1 + 1"。
- ◦arg:傳給指令的參數(shù),可選。例如 v-my-directive:foo 中,參數(shù)為 "foo"。
- ◦modifiers:一個(gè)包含修飾符的對(duì)象。例如:v-my-directive.foo.bar 中,修飾符對(duì)象為 { foo: true, bar: true }。
- oldVnode:上一個(gè)虛擬節(jié)點(diǎn),僅在 update 和 componentUpdated 鉤子中可用。
具體事例
clickoutside.js
用途:clickoutside.js主要用于解決點(diǎn)解元素外的地方時(shí)執(zhí)行函數(shù) 主要應(yīng)用的常見有彈出層點(diǎn)擊遮罩層是隱藏窗口,或者一些彈出層點(diǎn)擊其他地方要消失的場(chǎng)景
v-clickoutside具體是怎么實(shí)現(xiàn)的
答:主要是通過(guò)在bind中定義函數(shù) 通過(guò)判斷是否包含元素,執(zhí)行binding.value函數(shù)
export default { /* @param el 指令所綁定的元素 @param binding {Object} @param vnode vue編譯生成的虛擬節(jié)點(diǎn) */ bind (el, binding, vnode) { const documentHandler = function(e) { if(!vnode.context || el.contains(e.target)) { return false; } if (binding.expression) { binding.value(e) } } document.addEventListener('click', documentHandler) }, update (el, binding) { }, unbind(el) { document.removeEventListener('click', documentHandler); } }
Vue.directive使用注意
首先,Vue.directive要在實(shí)例初始化之前,不然會(huì)報(bào)錯(cuò),還有,定義的指令不支持駝峰式寫法,也會(huì)報(bào)下面同樣的錯(cuò),雖然在源碼中沒有找到在哪里統(tǒng)一處理大小寫,但是在有關(guān)directive的方法中捕捉到的指令命名統(tǒng)一變?yōu)樾?所以,還是用'-'或者'_'分割吧。
vue.js:491 [Vue warn]: Failed to resolve directive: xxx
然后,其定義方式有兩種,一種是Vue.directive('xxx', function(el, bind, vNode){}),其中el為dom,vNode為vue的虛擬dom,bind為一較復(fù)雜對(duì)象,詳情可見Vue-directive鉤子函數(shù)中的參數(shù)的參數(shù),還有一種,為
Vue.directive('my-directive', { bind: function () {}, inserted: function () {}, update: function () {}, componentUpdated: function () {}, unbind: function () {} })
參數(shù)代表的含義,參見鉤子函數(shù)描述
最后,要使用自定義的指令,只需在對(duì)用的元素中,加上'v-'的前綴形成類似于內(nèi)部指令'v-if','v-text'的形式。
// Vue.directive Vue.directive('test_directive', function(el, bind, vNode){ el.style.color = bind.value; }); var app = new Vue({ el: '#app', data: { num: 10, color: 'red' }, methods: { add: function(){ this.num++; } } });
當(dāng)然,也可以將method中的方法加入,bind.value即為methods中的方法。
<div id="app"> <div v-test_directive="changeColor">{{num}}</div> <button @click="add">增加</button> </div> <script type="text/javascript"> // Vue.directive Vue.directive('test_directive', function(el, bind, vNode){ el.style.color = bind.value(); }); var app = new Vue({ el: '#app', data: { num: 10, color: 'red' }, methods: { add: function(){ this.num++; }, changeColor: function(){ return this.color; } } });
這種形式,可以模仿'v-once',并進(jìn)行一定的復(fù)雜邏輯,但是想要完全達(dá)到'v-once',可能需要考慮Vue-directive的鉤子函數(shù)各個(gè)周期。下面是固定num的值,使得add的方法無(wú)效。
<div id="app"> <div v-test_directive="changeColor">{{num}}</div> <button @click="add">增加</button> </div> <script type="text/javascript"> // Vue.directive Vue.directive('test_directive', function(el, bind, vNode){ el.style.color = bind.value(); }); var app = new Vue({ el: '#app', data: { num: 10, color: 'red' }, methods: { add: function(){ this.num++; }, changeColor: function(){ this.num = 20; return this.color; } } });
因?yàn)樾∩鷦倓偨佑|vue,所以,希望前輩能多加指點(diǎn)。也希望大家多多支持腳本之家。
相關(guān)文章
解決vue單頁(yè)使用keep-alive頁(yè)面返回不刷新的問(wèn)題
下面小編就為大家分享一篇解決vue單頁(yè)使用keep-alive頁(yè)面返回不刷新的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03vue里面v-bind和Props 利用props綁定動(dòng)態(tài)數(shù)據(jù)的方法
今天小編就為大家分享一篇vue里面v-bind和Props 利用props綁定動(dòng)態(tài)數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08基于Vue3和element-plus實(shí)現(xiàn)登錄功能(最終完整版)
這篇文章主要介紹了基于Vue3和element-plus實(shí)現(xiàn)一個(gè)完整的登錄功能,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03Vue+Element ui 根據(jù)后臺(tái)返回?cái)?shù)據(jù)設(shè)置動(dòng)態(tài)表頭操作
這篇文章主要介紹了Vue+Element ui 根據(jù)后臺(tái)返回?cái)?shù)據(jù)設(shè)置動(dòng)態(tài)表頭操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09vue封裝Animate.css動(dòng)畫庫(kù)的使用方式
這篇文章主要介紹了vue封裝Animate.css動(dòng)畫庫(kù)的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04Vue?報(bào)錯(cuò)-4058?ENOENT:no?such?file?or?directory的原因及解決方法
Vue?報(bào)錯(cuò)-4058?ENOENT:?no?such?file?or?directory的原因和解決辦法,關(guān)于為什么為會(huì)報(bào)這個(gè)錯(cuò)誤,按照字面意思的理解就是沒有找到這個(gè)文件或這個(gè)路徑,說(shuō)明是路徑不對(duì),本文給大家分享解決方案,感興趣的朋友一起看看吧2023-10-10