Vue directive

自定義指令 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í)候,你可能想在 bindupdate 時(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容