Vue自定義指令

??除了默認(rèn)設(shè)置的核心指令( v-model 和 v-show ),Vue 也允許注冊(cè)自定義指令。在Vue里,代碼復(fù)用的主要形式和抽象是組件。然而,有的情況下,仍然需要對(duì)純 DOM 元素進(jìn)行底層操作,這時(shí)候就會(huì)用到自定義指令。

【指令注冊(cè)】
  以一個(gè)input元素自動(dòng)獲得焦點(diǎn)為例,當(dāng)頁(yè)面加載時(shí),使用autofocuse可以讓元素將獲得焦點(diǎn) ,但是autofocuse在移動(dòng)版Safari上不工作,現(xiàn)在注冊(cè)一個(gè)使元素自動(dòng)獲取焦點(diǎn)的指令。
  指令注冊(cè)類似于組件注冊(cè),包括全局指令和局部指令兩種。

【全局指令】
  使用Vue.diretive()來(lái)全局注冊(cè)指令。

// 注冊(cè)一個(gè)全局自定義指令 v-focus
Vue.directive('focus', {
  // 當(dāng)綁定元素插入到 DOM 中。
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})

【局部指令】
  也可以注冊(cè)局部指令,組件或Vue構(gòu)造函數(shù)中接受一個(gè) directives 的選項(xiàng)。

var vm = new Vue({
  el: '#app',
  directives:{
    focus:{
      inserted: function (el) {
        el.focus()
      }      
    }
  }
})

??然后可以在模板中任何元素上使用新的 v-focus 屬性。

<div id="app">
  <input v-focus>
</div>
<script>
// 注冊(cè)一個(gè)全局自定義指令 v-focus
Vue.directive('focus', {
  // 當(dāng)綁定元素插入到 DOM 中。
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})
var vm = new Vue({
  el: '#app',
})
</script>

鉤子函數(shù)

指令定義函數(shù)提供了幾個(gè)鉤子函數(shù)(可選) 。

【bind】
  只調(diào)用一次,指令第一次綁定到元素時(shí)調(diào)用,用這個(gè)鉤子函數(shù)可以定義一個(gè)在綁定時(shí)執(zhí)行一次的初始化動(dòng)作。

【inserted】
  被綁定元素插入父節(jié)點(diǎn)時(shí)調(diào)用(父節(jié)點(diǎn)存在即可調(diào)用,不必存在于 document 中)。

【update】
  所在組件的 VNode 更新時(shí)調(diào)用,但是可能發(fā)生在其孩子的 VNode 更新之前。指令的值可能發(fā)生了改變也可能沒(méi)有。但是可以通過(guò)比較更新前后的值來(lái)忽略不必要的模板更新。

【componentUpdated】
  所在組件的 VNode 及其孩子的 VNode 全部更新時(shí)調(diào)用。

【unbind】
  只調(diào)用一次, 指令與元素解綁時(shí)調(diào)用。

鉤子函數(shù)參數(shù)

鉤子函數(shù)被賦予了以下參數(shù)

【el】
  指令所綁定的元素,可以用來(lái)直接操作 DOM。

【binding】
  一個(gè)對(duì)象,包含以下屬性:

name: 指令名,不包括 v- 前綴。
value: 指令的綁定值, 例如: v-my-directive="1 + 1", value 的值是 2。
oldValue: 指令綁定的前一個(gè)值,僅在 update 和 componentUpdated 鉤子中可用。無(wú)論值是否改變都可用。
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 鉤子中可用。
  [注意]除了 el 之外,其它參數(shù)都是只讀的,盡量不要修改他們。如果需要在鉤子之間共享數(shù)據(jù),建議通過(guò)元素的 dataset 來(lái)進(jìn)行。

下面是一個(gè)使用了這些參數(shù)的自定義鉤子樣例

<div id="app" v-demo:foo.a.b="message"></div>
<script>
Vue.directive('demo', {
  bind: function (el, binding, vnode) {
    var s = JSON.stringify
    el.innerHTML =
      'name: '       + s(binding.name) + '<br>' +
      'value: '      + s(binding.value) + '<br>' +
      'expression: ' + s(binding.expression) + '<br>' +
      'argument: '   + s(binding.arg) + '<br>' +
      'modifiers: '  + s(binding.modifiers) + '<br>' +
      'vnode keys: ' + Object.keys(vnode).join(', ')
  }
})
new Vue({
  el: '#app',
  data: {
    message: 'hello!'
  }
})
</script>

【函數(shù)簡(jiǎn)寫】
   大多數(shù)情況下,可能想在bind和update鉤子上做重復(fù)動(dòng)作,并且不想關(guān)心其它的鉤子函數(shù)??梢赃@樣寫:

Vue.directive('color-swatch', function (el, binding) {
  el.style.backgroundColor = binding.value
})

【對(duì)象字面量】
  如果指令需要多個(gè)值,可以傳入一個(gè)JS對(duì)象字面量,指令函數(shù)能夠接受所有合法類型的JS表達(dá)式。

<div v-demo="{ color: 'white', text: 'hello!' }"></div>
Vue.directive('demo', function (el, binding) {
  console.log(binding.value.color) // => "white"
  console.log(binding.value.text)  // => "hello!"
})
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我們都知道html5的拖放特性,利用它可以很方便的實(shí)現(xiàn)拖拽和放置功能,比如一些選擇類操作的使用場(chǎng)景,讓用戶去拖拽比...
    _乾_閱讀 1,534評(píng)論 2 13
  • 除了內(nèi)置的指令外,Vue 也允許注冊(cè)自定義指令。 vue用Vue.directive(id,definition)...
    G_石頭閱讀 446評(píng)論 0 0
  • 最近經(jīng)常使用指令來(lái)實(shí)現(xiàn)一些功能,覺(jué)得甚是好用。然而卻遇到一個(gè)問(wèn)題:v-if和我自定義指令在同一個(gè)標(biāo)簽里使用的時(shí)候,...
    墨子柚閱讀 1,777評(píng)論 0 0
  • Vue 自定義指令 全局定義 局部定義 Vue 指令生命周期鉤子 bind:只調(diào)用一次,指令第一次綁定到元素時(shí)調(diào)用...
    ChangLau閱讀 295評(píng)論 0 1
  • facebook關(guān)停AI語(yǔ)音事件,這些由冰冷的人工智能自己創(chuàng)造出來(lái)的,僅供AI圈子的內(nèi)部交流使用。人工智能運(yùn)算法則...
    約你一生閱讀 517評(píng)論 0 0

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