首先呢,我們都知道道川,vue中有很多很多的內(nèi)置指令午衰,如v-model、v-for冒萄、v-show等臊岸,除了這些內(nèi)置指令,vue也允許我們注冊(cè)自定義指令尊流。自定義指令提供一種機(jī)制將數(shù)據(jù)的變化反應(yīng)為DOM行為帅戒。(介紹中的鉤子函數(shù)以及鉤子函數(shù)參數(shù)都是在官方文檔中拿來的)
(這一節(jié)文章的內(nèi)容中所涉及到的代碼均采用圖片的形式,一是保證代碼正確的運(yùn)行崖技,二是為了讓大家自己敲打以增加熟練度逻住,不要一味的ctrl+c施流、ctrl+v)
1. 鉤子函數(shù)(均為可選)
????????bind:只調(diào)用一次,指令第一次綁定到元素時(shí)調(diào)用鄙信。在這里可以進(jìn)行一次性的初始化設(shè)置。
????????inserted:被綁定元素插入父節(jié)點(diǎn)時(shí)調(diào)用 (僅保證父節(jié)點(diǎn)存在忿晕,但不一定已被插入文檔中)装诡。
????????update:所在組件的 VNode 更新時(shí)調(diào)用,但是可能發(fā)生在其子 VNode 更新之前践盼。指令的值可能發(fā)生了改變鸦采,也可能沒有。但是你可以通過比較更新前后的值來忽略不必要的模板更新 (詳細(xì)的鉤子函數(shù)參數(shù)見下)咕幻。
????????componentUpdated:指令所在組件的 VNode?及其子 VNode?全部更新后調(diào)用渔伯。
????????unbind:只調(diào)用一次,指令與元素解綁時(shí)調(diào)用肄程。
el:指令所綁定的元素锣吼,可以用來直接操作 DOM 。
?binding:一個(gè)對(duì)象蓝厌,包含以下屬性:
????name:指令名玄叠,不包括?v-?前綴。
????value:指令的綁定值拓提,例如:v-my-directive="1 + 1"?中读恃,綁定值為?2。
????oldValue:指令綁定的前一個(gè)值代态,僅在?update?和?componentUpdated?鉤子中可用寺惫。無論值是否改變都可用。
????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 }券盅。
vnode:Vue 編譯生成的虛擬節(jié)點(diǎn)帮哈。移步?VNode API?來了解更多詳情。
oldVnode:上一個(gè)虛擬節(jié)點(diǎn)锰镀,僅在?update?和?componentUpdated?鉤子中可用娘侍。
除了?el?之外咖刃,其它參數(shù)都應(yīng)該是只讀的,切勿進(jìn)行修改憾筏。如果需要在鉤子之間共享數(shù)據(jù)嚎杨,建議通過元素的?dataset?來進(jìn)行。
3. 指令格式(官方文檔中也給出了相應(yīng)的示例氧腰,本節(jié)文章中不采用官網(wǎng)給出的示例枫浙,后邊我們會(huì)簡單的寫一個(gè)示例)
????????自定義指令的基本格式以及每部分的功能
????????什么?還是不知道怎么用古拴?好吧箩帚,下面我就給大家寫一個(gè)簡單的案例
4. 簡單的案例
? ? ? ? 之前在網(wǎng)上看到過一個(gè)谷歌圖片的加載,在圖片未完成加載前黄痪,用隨機(jī)的背景色占位紧帕,等到圖片加載完成后,再展示出來桅打,下邊先上代碼
? ? ? ? a. 指令代碼
? ? ? ? b. 使用(具體效果就不放出來了是嗜,懶得搞gif圖片了,可以自己拿去試試)
5.? 函數(shù)簡寫(文檔中也有存在)
????????在很多時(shí)候油额,你可能想在?bind?和?update?時(shí)觸發(fā)相同行為叠纷,而不關(guān)心其它的鉤子。比如這樣寫:
6. 對(duì)象字面量
如果指令需要多個(gè)值潦嘶,可以傳入一個(gè) JavaScript 對(duì)象字面量涩嚣。記住,指令函數(shù)能夠接受所有合法的 JavaScript 表達(dá)式掂僵。