自定義指令 directive
詳見官網(wǎng):https://cn.vuejs.org/v2/guide/custom-directive.html
在 Vue2.0 中,代碼復(fù)用和抽象的主要形式是組件。然而,有的情況下,你仍然需要對(duì)普通 DOM 元素進(jìn)行底層操作,這時(shí)候就會(huì)用到自定義指令;
鉤子函數(shù)
一個(gè)指令定義對(duì)象可以提供如下幾個(gè)鉤子函數(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)用。
提示:與樣式相關(guān)的操作均可在bind中執(zhí)行;與js行為相關(guān)的操作,最好在inserted中執(zhí)行
鉤子函數(shù)參數(shù)
指令鉤子函數(shù)會(huì)被傳入以下參數(shù):
el:指令所綁定的元素,可以用來直接操作 DOM。-
binding:一個(gè)對(duì)象,包含以下property:- name:指令名,不包括 v- 前綴
- rawName:指令名,包括 v- 前綴、參數(shù)和修飾符。例如 v-my-directive:foo.aa 中,rawName為"v-my-directive:foo.aa"
- expression:字符串形式的指令表達(dá)式。例如 v-my-directive="1 + 1" 中,表達(dá)式為 "1 + 1"
- value:指令的綁定值,例如:v-my-directive="1 + 1" 中,綁定值為 2
- oldValue:指令綁定的前一個(gè)值,僅在 update 和 componentUpdated 鉤子中可用。無論值是否改變都可用。
- 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)行。
動(dòng)態(tài)指令參數(shù)
指令的參數(shù)可以是動(dòng)態(tài)的。例如,在 v-mydirective:[argument]="value" 中,argument 參數(shù)可以根據(jù)組件實(shí)例數(shù)據(jù)進(jìn)行更新!這使得自定義指令可以在應(yīng)用中被靈活使用。
//動(dòng)態(tài)參數(shù)必須指定到data中
export default {
data() {
return {
argument: 'top'
}
}
}
對(duì)象字面量
如果指令需要多個(gè)值,可以傳入一個(gè) JavaScript 對(duì)象字面量。記住,指令函數(shù)能夠接受所有合法的 JavaScript 表達(dá)式。
<div v-demo="{ color: 'white', text: content }"></div>
//支持data中動(dòng)態(tài)的值
export default {
data() {
return {
content: '中國(guó)人'
}
}
}
函數(shù)的簡(jiǎn)寫
在很多時(shí)候,你可能想在 bind 和 update 時(shí)觸發(fā)相同行為,而不關(guān)心其它的鉤子。比如這樣寫:
//簡(jiǎn)寫
Vue.directive('color-swatch', function (el, binding) {
el.style.backgroundColor = binding.value
})
//完整寫法
Vue.directive('color-switch', {
bind: function(el, binding) {
el.style.backgroundColor = binding.value
},
inserted: function(el, binding) {
el.style.backgroundColor = binding.value
},
update: function(el, binding) {
el.style.backgroundColor = binding.value
}
})
私有指令
directives: {
//非簡(jiǎn)寫形式
focus: {
inserted: function(el, binding) {
el.focus()
}
},
//簡(jiǎn)寫形式
"change-color": function(el, binding) {
el.style.color = binding.value
}
}
共用指令
見過濾器共用指令
- 當(dāng)全局自定義指令和私有自定義指令重名時(shí),會(huì)采用私有自定義指令.
命名與使用規(guī)范
- 命名時(shí),使用 - 連接,而不是駝峰命名法
- 命名時(shí)無需加 v- 而使用時(shí),一定需要;例如:my-demo, 使用時(shí)為 v-my-demo