在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ 自定義指令
自定義過濾器
自定義指令
概述
安裝
起步
深入響應(yīng)式原理
Class 與 Style 綁定
混合
列表渲染
方法與事件處理器
表單控件綁定
對(duì)比其它框架
組件
計(jì)算屬性
插件
數(shù)據(jù)綁定語法
構(gòu)建大型應(yīng)用
條件渲染
Vue 實(shí)例
過渡

自定義指令

基礎(chǔ)

除了內(nèi)置指令,Vue.js 也允許注冊(cè)自定義指令。自定義指令提供一種機(jī)制將數(shù)據(jù)的變化映射為 DOM 行為。

可以用 Vue.directive(id, definition) 方法注冊(cè)一個(gè)全局自定義指令,它接收兩個(gè)參數(shù)指令 ID定義對(duì)象。也可以用組件的 directives 選項(xiàng)注冊(cè)一個(gè)局部自定義指令。

鉤子函數(shù)

定義對(duì)象可以提供幾個(gè)鉤子函數(shù)(都是可選的):

  • bind:只調(diào)用一次,在指令第一次綁定到元素上時(shí)調(diào)用。

  • update: 在 bind 之后立即以初始值為參數(shù)第一次調(diào)用,之后每當(dāng)綁定值變化時(shí)調(diào)用,參數(shù)為新值與舊值。

  • unbind:只調(diào)用一次,在指令從元素上解綁時(shí)調(diào)用。

示例

Vue.directive('my-directive', {
  bind: function () {
    // 準(zhǔn)備工作
    // 例如,添加事件處理器或只需要運(yùn)行一次的高耗任務(wù)
  },
  update: function (newValue, oldValue) {
    // 值更新時(shí)的工作
    // 也會(huì)以初始值為參數(shù)調(diào)用一次
  },
  unbind: function () {
    // 清理工作
    // 例如,刪除 bind() 添加的事件監(jiān)聽器
  }
})

在注冊(cè)之后,便可以在 Vue.js 模板中這樣用(記著添加前綴 v-):

<div v-my-directive="someValue"></div>

當(dāng)只需要 update 函數(shù)時(shí),可以傳入一個(gè)函數(shù)替代定義對(duì)象:

Vue.directive('my-directive', function (value) {
  // 這個(gè)函數(shù)用作 update()
})

指令實(shí)例屬性

所有的鉤子函數(shù)將被復(fù)制到實(shí)際的指令對(duì)象中,鉤子內(nèi) this 指向這個(gè)指令對(duì)象。這個(gè)對(duì)象暴露了一些有用的屬性:

  • el: 指令綁定的元素。
  • vm: 擁有該指令的上下文 ViewModel。
  • expression: 指令的表達(dá)式,不包括參數(shù)和過濾器。
  • arg: 指令的參數(shù)。
  • name: 指令的名字,不包含前綴。
  • modifiers: 一個(gè)對(duì)象,包含指令的修飾符。
  • descriptor: 一個(gè)對(duì)象,包含指令的解析結(jié)果。

你應(yīng)當(dāng)將這些屬性視為只讀的,不要修改它們。你也可以給指令對(duì)象添加自定義屬性,但是注意不要覆蓋已有的內(nèi)部屬性。

示例:

<div id="demo" v-demo:hello.a.b="msg"></div>
Vue.directive('demo', {
  bind: function () {
    console.log('demo bound!')
  },
  update: function (value) {
    this.el.innerHTML =
      'name - '       + this.name + '<br>' +
      'expression - ' + this.expression + '<br>' +
      'argument - '   + this.arg + '<br>' +
      'modifiers - '  + JSON.stringify(this.modifiers) + '<br>' +
      'value - '      + value
  }
})
var demo = new Vue({
  el: '#demo',
  data: {
    msg: 'hello!'
  }
})

結(jié)果

對(duì)象字面量

如果指令需要多個(gè)值,可以傳入一個(gè) JavaScript 對(duì)象字面量。記住,指令可以使用任意合法的 JavaScript 表達(dá)式:

<div v-demo="{ color: 'white', text: 'hello!' }"></div>
Vue.directive('demo', function (value) {
  console.log(value.color) // "white"
  console.log(value.text) // "hello!"
})

字面修飾符

當(dāng)指令使用了字面修飾符,它的值將按普通字符串處理并傳遞給 update 方法。update 方法將只調(diào)用一次,因?yàn)槠胀ㄗ址荒茼憫?yīng)數(shù)據(jù)變化。

<div v-demo.literal="foo bar baz">
Vue.directive('demo', function (value) {
  console.log(value) // "foo bar baz"
})

元素指令

有時(shí)我們想以自定義元素的形式使用指令,而不是以特性的形式。這與 Angular 的 “E” 指令非常相似。元素指令可以看做是一個(gè)輕量組件??梢韵裣旅孢@樣注冊(cè)一個(gè)自定義元素指令:

Vue.elementDirective('my-directive', {
  // API 同普通指令
  bind: function () {
    // 操作 this.el...
  }
})

不這樣寫:

<div v-my-directive></div>

這樣寫:

<my-directive></my-directive>

元素指令不能接受參數(shù)或表達(dá)式,但是它可以讀取元素的特性從而決定它的行為。

迥異于普通指令,元素指令是終結(jié)性的,這意味著,一旦 Vue 遇到一個(gè)元素指令,它將跳過該元素及其子元素——只有該元素指令本身可以操作該元素及其子元素。

高級(jí)選項(xiàng)

params

自定義指令可以接收一個(gè) params 數(shù)組,指定一個(gè)特性列表,Vue 編譯器將自動(dòng)提取綁定元素的這些特性。例如:

<div v-example a="hi"></div>
Vue.directive('example', {
  params: ['a'],
  bind: function () {
    console.log(this.params.a) // -> "hi"
  }
})

此 API 也支持動(dòng)態(tài)屬性。this.params[key] 會(huì)自動(dòng)保持更新。另外,可以指定一個(gè)回調(diào),在值變化時(shí)調(diào)用:

<div v-example v-bind:a="someValue"></div>
Vue.directive('example', {
  params: ['a'],
  paramWatchers: {
    a: function (val, oldVal) {
      console.log('a changed!')
    }
  }
})

deep

如果自定義指令用在一個(gè)對(duì)象上,當(dāng)對(duì)象內(nèi)部屬性變化時(shí)要觸發(fā) update,則在指令定義對(duì)象中指定 deep: true。

<div v-my-directive="obj"></div>
Vue.directive('my-directive', {
  deep: true,
  update: function (obj) {
    // 在 `obj` 的嵌套屬性變化時(shí)調(diào)用
  }
})

twoWay

如果指令想向 Vue 實(shí)例寫回?cái)?shù)據(jù),則在指令定義對(duì)象中指定 twoWay: true 。該選項(xiàng)允許在指令中使用 this.set(value):

Vue.directive('example', {
  twoWay: true,
  bind: function () {
    this.handler = function () {
      // 將數(shù)據(jù)寫回 vm
      // 如果指令這樣綁定 v-example="a.b.c"
      // 它將用給定值設(shè)置 `vm.a.b.c`      
      this.set(this.el.value)
    }.bind(this)
    this.el.addEventListener('input', this.handler)
  },
  unbind: function () {
    this.el.removeEventListener('input', this.handler)
  }
})

acceptStatement

傳入 acceptStatement:true 可以讓自定義指令接受內(nèi)聯(lián)語句,就像 v-on 那樣:

<div v-my-directive="a++"></div>
Vue.directive('my-directive', {
  acceptStatement: true,
  update: function (fn) {
    // 傳入值是一個(gè)函數(shù)
    // 在調(diào)用它時(shí)將在所屬實(shí)例作用域內(nèi)計(jì)算 "a++" 語句
  }
})

明智地使用,因?yàn)橥ǔD阋谀0逯斜苊飧毙?yīng)。

priority

可以給指令指定一個(gè)優(yōu)先級(jí)(默認(rèn)是 1000)。同一個(gè)元素上優(yōu)先級(jí)高的指令會(huì)比其它指令處理得早一些。優(yōu)先級(jí)一樣的指令按照它在元素特性列表中出現(xiàn)的順序依次處理,但是不能保證這個(gè)順序在不同的瀏覽器中是一致的。

可以在 API 中查看內(nèi)置指令的優(yōu)先級(jí)。另外,流程控制指令 v-ifv-for 在編譯過程中始終擁有最高的優(yōu)先級(jí)。

上一篇:方法與事件處理器下一篇:過渡