Vue.js第十課 自定義指令

葡萄酒不吐葡萄皮發表於2019-02-16

除了預設設定的核心指令( v-model 和 v-show ), Vue 也允許註冊自定義指令。

下面我們註冊一個全域性指令 v-focus, 該指令的功能是在頁面載入時,元素獲得焦點:
例項
<div id=”app”>

<p>頁面載入時,input 元素自動獲取焦點:</p>
<input v-focus>

</div>

<script>
// 註冊一個全域性自定義指令 v-focus
Vue.directive(`focus`, {
// 當繫結元素插入到 DOM 中。
inserted: function (el) {

// 聚焦元素
el.focus()

}
})
// 建立根例項
new Vue({
el: `#app`
})
</script>

我們也可以在例項使用 directives 選項來註冊區域性指令,這樣指令只能在這個例項中使用:
例項
<div id=”app”>
<p>頁面載入時,input 元素自動獲取焦點:</p>
<input v-focus>
</div>

<script>
// 建立根例項
new Vue({
el: `#app`,
directives: {

// 註冊一個區域性的自定義指令 v-focus
focus: {
  // 指令的定義
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
}

}
})
</script>

鉤子
鉤子函式

指令定義函式提供了幾個鉤子函式(可選):

bind: 只呼叫一次,指令第一次繫結到元素時呼叫,用這個鉤子函式可以定義一個在繫結時執行一次的初始化動作。

inserted: 被繫結元素插入父節點時呼叫(父節點存在即可呼叫,不必存在於 document 中)。

update: 被繫結元素所在的模板更新時呼叫,而不論繫結值是否變化。通過比較更新前後的繫結值,可以忽略不必要的模板更新(詳細的鉤子函式引數見下)。

componentUpdated: 被繫結元素所在模板完成一次更新週期時呼叫。

unbind: 只呼叫一次, 指令與元素解綁時呼叫。

鉤子函式引數

鉤子函式的引數有:

el: 指令所繫結的元素,可以用來直接操作 DOM 。
binding: 一個物件,包含以下屬性:
    name: 指令名,不包括 v- 字首。
    value: 指令的繫結值, 例如: v-my-directive="1 + 1", value 的值是 2。
    oldValue: 指令繫結的前一個值,僅在 update 和 componentUpdated 鉤子中可用。無論值是否改變都可用。
    expression: 繫結值的字串形式。 例如 v-my-directive="1 + 1" , expression 的值是 "1 + 1"。
    arg: 傳給指令的引數。例如 v-my-directive:foo, arg 的值是 "foo"。
    modifiers: 一個包含修飾符的物件。 例如: v-my-directive.foo.bar, 修飾符物件 modifiers 的值是 { foo: true, bar: true }。
vnode: Vue 編譯生成的虛擬節點,查閱 VNode API 瞭解更多詳情。
oldVnode: 上一個虛擬節點,僅在 update 和 componentUpdated 鉤子中可用。

以下例項演示了這些引數的使用:
例項
<div id=”app” v-runoob:hello.a.b=”message”>
</div>

<script>
Vue.directive(`runoob`, {
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: `菜鳥教程!`

}
})
</script>

有時候我們不需要其他鉤子函式,我們可以簡寫函式,如下格式:

Vue.directive(`runoob`, function (el, binding) {
// 設定指令的背景顏色
el.style.backgroundColor = binding.value.color
})

指令函式可接受所有合法的 JavaScript 表示式,以下例項傳入了 JavaScript 物件:
例項
<div id=”app”>

<div v-runoob="{ color: `green`, text: `菜鳥教程!` }"></div>

</div>

<script>
Vue.directive(`runoob`, function (el, binding) {

// 簡寫方式設定文字及背景顏色
el.innerHTML = binding.value.text
el.style.backgroundColor = binding.value.color

})
new Vue({
el: `#app`
})
</script>

相關文章