除了核心功能默認的內置指令(v-model和v-show),vue也容許註冊自定義指令。注意,在Vue2.0中,代碼複用和抽象的主要形式是組件,可是在有些狀況下,咱們須要對普通的DOM元素進行底層操做,這時候就須要咱們用到自定義指令。html
簡單事例,當頁面加載時元素就會得到焦點,可是實際上只要咱們代碼完成,頁面沒打開時這個輸入框已是聚焦狀態:vue
<!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和定義對象來註冊一個全局的自定義指令,一個指令對象能夠提供幾個鉤子函數:node
定義對象的鉤子函數參數有(除了el以外其餘參數都是i只讀的)express
指令的參數能夠是動態的。 自定義鉤子函數屬性屬性事例:app
<!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 })
若是指令須要多個值,那麼能夠傳入一個JavaScript對象字面量;同一個特性內部,逗號隔開的多個從句被綁定爲多個指令實例。code
<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>