什麼時候會用到自定義指令?除了原本的默認內置指令,雖然 Vue 的元件是可以複用的,但有時候我們仍然需要對普通 DOM 元素進行不同效果的操作,這時候就會用到自定義指令。在 Vue 內建的指令無法滿足需求或需要一個特別的功能時,就可以自己攥寫自定義指令,好處是可以重複使用。
自定義指定有兩種:全域自定義指令與局部的自定義指令。有時候我們在一個頁面裡可能會引入或增加好幾個 Vue 的實例,如果是全域的自定義指令,表示所有的 Vue 實例都可使用這個指令,但如果是局部自定義指令,需要指定能使用這組指令的 Vue 實例。
先來看 codepen :
Vue.Js Custom Directives 自定義指令
全域的寫法
1 | // Global 全域自定義指令 ps. directive 沒有 s |
局部的寫法
1 | // 局部的自定義指令 ps. directives 有 s |
如何使用
在 HTML 的元素標籤上,直接以自定義的指令
1 | <p v-my-directive = 'xxx';></p> |
實作兩個自定義指令
- 功能的類型為
v-text
,功能是可將字串轉換成大寫,取名為v-upper-text
- 功能的類型為
v-text
,功能是可將字串轉換成小寫,取名為v-lower-text
需要注意的是,我們自訂的指令名,並不包含v-
例如上述要實作的v-upper-text
,指令名為upper-text
,v-
一但定義了這些自定義的指令,在使用時就需要加上v-
。而只最終會被寫在 HTML 的元素標籤裡。
這個指令名會對應到一個「處理函式」,如以下範例的Vue.directive()
的第二參數
以下面的範例的 callback 函式來看,有兩個參數,第一個為el
表示使用這個指令的標籤,第二個參數binding
我們可以試著console.log()
出來觀察。
1 | <div id="app1"> |
1 | // 註冊定義全局指令 |
在官網也提供一個很實用的範例,例如會員登入頁,我們希望使用者一進入頁面,不需將滑鼠移至輸入帳號的 input 框裡,而可直接輸入在輸入框裡,就可設一個全域的自定義的指令,這樣無論在哪一個登入頁面,只要需要先登入,就可使用這個 input 聚焦的指令在 input 裡,達到到達頁面可直接輸入內容的效果。
HTML 部分
1 | <input v-focus> |
JavaScript 部分
1 | // 註冊一個全局自定義指令 `v-focus` |