1. 程式人生 > 實用技巧 >理解vue自定義指令

理解vue自定義指令

基礎簡介

除了核心功能預設的內建指令(v-model和v-show),vue也允許註冊自定義指令。注意,在vue2.0中,程式碼複用和抽象的主要形式是元件,但是在有些情況下,我們需要對普通的DOM元素進行底層操作,這時候就需要我們用到自定義指令。

簡單事例,當頁面載入時元素就會獲得焦點,但是實際上只要我們程式碼完成,頁面沒開啟時這個輸入框已經是聚焦狀態:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <script src="Vue.min.js"></script>
</head>

<body>
  <div
id="app"> <input v-focus> </div> <script> //註冊一個全域性自定義指令v-focus Vue.directive('focus', { // 當繫結元素插入到DOM中 inserted: function (el) { // 聚焦元素 el.focus() } }); var app = new Vue({ el: '#app' }); </script> </body> </html>

鉤子函式

我們可以使用Vue.directive的方法傳入執行id和定義物件來註冊一個全域性的自定義指令,一個指令物件可以提供幾個鉤子函式:

  • bind:只調用一次,指令第一次繫結元素的時候呼叫,這時我們可以進行對它的一次性初始化設定。
  • inserted,被繫結元素插入父節點時的呼叫。
  • update,所在元件的 VNode 更新時呼叫,但是可能發生在元件的 VNode更新前,因此指令的值是不確定的,可能有也可能沒有。
  • componentUpdated,指令所在元件的 VNode以及它之後的更新呼叫。
  • unbind,只調用一次,指令與元素解綁時呼叫。

定義物件的鉤子函式引數有(除了el之外其他引數都是i只讀的)

  • el:指令繫結的元素,可以被用來直接操作DOM。
  • binding
    • name:指令名,不包括 v- 字首。
    • value:指令的繫結值,例如:v-new-xkd:"1+2";,繫結值為3。
    • oldValue:指令繫結的前一個值,只在update 和 componentUpdated 鉤子中使用。
    • expression:字串形式的指令表示式。例如上面 v-new-xkd中的"1+2"。
    • arg:傳給指令的引數。
    • modifiers:一個包含修飾符的物件。
  • vnode:Vue 編譯生成的虛擬節點。
  • oldVnode:上一個虛擬節點。

指令的引數可以是動態的。 自定義鉤子函式屬性屬性事例:

<!DOCTYPE html>
<html lang="en">
<head>  
<meta charset="utf-8">
<script src="Vue.min.js"></script>
</head>

<body>  
<div id="hook" v-xkd:foo.a.b="message"></div>  
<script>   
// 使用自定義指令   
Vue.directive('xkd', {    
// 指令在繫結到元素要執行的操作    
bind: function (el, binding, vnode) {    
	var w = JSON.stringify;    
	// 準備將傳遞來的引數顯示在呼叫該指令的元素的innerHTML上  
	el.innerHTML =     
	'name: ' + w(binding.name) + '<br><br>' +     
	'value: ' + w(binding.value) + '<br><br>' +   
	'expression: ' + w(binding.expression) + '<br><br>' + 
	'argument: ' + w(binding.arg) + '<br><br>' +    
	'modifiers: ' + w(binding.modifiers) + '<br><br>' +  
	'vnode keys: ' + Object.keys(vnode).join(', ')   
    } 
})   
// 建立自定義指令   
new Vue({    
	el: '#hook',    
	data: {     
		message: '俠課島'    
	}   
})  </script></body></html>

函式簡寫

大多數情況下,可能想在 bind 和 update 鉤子上做重複的動作,但是並不想關心其他鉤子函式的情況,我們可以這樣寫:

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

PPT模板下載大全https://www.wode007.com

物件字面量物件字面量

如果指令需要多個值,那麼可以傳入一個JavaScript物件字面量;同一個特性內部,逗號隔開的多個從句被繫結為多個指令例項。

<div id="hook" v-demo="{ color: 'green', text: 'Chivalrous Island!'}"></div>

<script>
	Vue.directive('demo', function (el, binding) {
      console.log(binding.value.color);
      console.log(binding.value.text);
    })

    // 建立自定義指令
    new Vue({
      el: '#hook',
      data: {
        message: '俠課島'
      }
    })
</script>