源自:https://cn.vuejs.org/v2/guide/index.html
鉤子函數(shù)
一個指令定義對象可以提供如下幾個鉤子函數(shù) (均為可選):
bind:只調(diào)用一次,指令第一次綁定到元素時調(diào)用。在這里可以進行一次性的初始化設(shè)置。
inserted:被綁定元素插入父節(jié)點時調(diào)用 (僅保證父節(jié)點存在,但不一定已被插入文檔中)。
update:所在組件的 VNode 更新時調(diào)用,但是可能發(fā)生在其子 VNode 更新之前。指令的值可能發(fā)生了改變,也可能沒有。但是你可以通過比較更新前后的值來忽略不必要的模板更新 (詳細的鉤子函數(shù)參數(shù)見下)。
componentUpdated:指令所在組件的 VNode?及其子 VNode?全部更新后調(diào)用。
unbind:只調(diào)用一次,指令與元素解綁時調(diào)用。
鉤子函數(shù)參數(shù),指令鉤子函數(shù)會被傳入以下參數(shù):
el:指令所綁定的元素,可以用來直接操作 DOM 。
binding:一個對象,包含以下屬性:
? ? name:指令名,不包括 v- 前綴。
? ? value:指令的綁定值,例如:v-my-directive="1 + 1" 中,綁定值為 2。
????oldValue:指令綁定的前一個值,僅在 update 和 componentUpdated 鉤子中可用。無論值是否改變都可用。
????expression:字符串形式的指令表達式。例如 v-my-directive="1 + 1" 中,表達式為 "1 + 1"。
????arg:傳給指令的參數(shù),可選。例如 v-my-directive:foo 中,參數(shù)為 "foo"。
????modifiers:一個包含修飾符的對象。例如:v-my-directive.foo.bar 中,修飾符對象為 { foo: true, bar: true }。?
vnode:Vue 編譯生成的虛擬節(jié)點。移步 VNode API 來了解更多詳情。
oldVnode:上一個虛擬節(jié)點,僅在 update 和 componentUpdated 鉤子中可用。
注意:除了?el?之外,其它參數(shù)都應(yīng)該是只讀的,切勿進行修改。如果需要在鉤子之間共享數(shù)據(jù),建議通過元素的?dataset?來進行。
<div id="hook-arguments-example" v-demo:foo.a.b="message"></div>
Vue.directive('demo', { 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: '#hook-arguments-example', data: { message: 'hello!' }})

如果指令需要多個值,可以傳入一個 JavaScript 對象字面量。記住,指令函數(shù)能夠接受所有合法的 JavaScript 表達式。
<div v-demo="{ color: 'white', text: 'hello!' }"></div>
Vue.directive('demo', function (el, binding) {
?console.log(binding.value.color) // => "white"
?console.log(binding.value.text) // => "hello!"
?})