; ]: H+ U1 x" V; x5 z, G除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例+ V! K b/ Q2 j$ x8 I" [7 Z" q
q; l( u0 r4 V A
- <div id="app">& c8 i, b+ a- P; J8 z7 r
- <p>页面载入时,input 元素自动获取焦点:</p>( G$ |+ ~1 ?( I5 D( [
- <input v-focus>
! Y& R3 |& V6 C, T$ t1 ]: o - </div>
' X) ^! t! Q! n' E9 f# h - # N p( k& W# r* X7 q( W' \
- <script># O8 a7 k7 N3 m% i P
- // 注册一个全局自定义指令 v-focus
, N, T/ p7 v7 g0 L) J- S - Vue.directive('focus', {+ W- b( L* C5 B9 }
- // 当绑定元素插入到 DOM 中。0 x% v# Q" `7 ?, r& W( P
- inserted: function (el) {
1 M3 ~/ Q; V/ r6 S) [* o9 p1 ^6 B - // 聚焦元素
}9 r3 K2 l! U: a2 r$ X - el.focus()" p1 ~0 {6 S% G: U! O) y3 x
- }
, U& A8 w* w. P - })
+ g: h) K( D6 X2 a) B0 p" r - // 创建根实例
3 G5 ]3 H1 f+ [ - new Vue({
4 X) q! y' ?2 ^& r& L - el: '#app'
7 Z; x; B% q% n! V9 e; V* q - })
, P1 I0 x7 S9 h. _( r0 T- R - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例/ J8 U& g" S5 C5 Q) c9 ^
: w, @# ^9 l: f% M5 P
- <div id="app">
) I Y1 C( _6 r# `' v - <p>页面载入时,input 元素自动获取焦点:</p>
6 k$ t% ?. X2 ` - <input v-focus>
. o+ Q1 R* F' V/ Z, v - </div>
/ t6 b# g0 }0 \% }- N - , f0 @ C2 o2 |; S2 C( p
- <script>6 I0 S" d5 J+ l3 k; \
- // 创建根实例
* O: r% R0 B6 T4 t% K/ f7 w! W - new Vue({" ^8 t/ w$ z j, `. c. L: }4 C) W
- el: '#app',! m( K1 T8 s( R/ k$ q
- directives: {
6 M: c9 S5 k" o2 D% S) o# A. j - // 注册一个局部的自定义指令 v-focus
V# W& Q; T7 @% B I4 q/ l - focus: {: Y+ S$ v5 E( Q9 g9 X, M
- // 指令的定义. ~% v/ _6 \! ]4 d' F
- inserted: function (el) {7 S' y2 O# M& w; I+ V" e' B
- // 聚焦元素4 S) f' \! l7 g& m, I3 S9 j
- el.focus() D$ B5 m0 ?7 _
- }* ?3 X8 j6 X1 w, {- O6 c: ~# S9 j1 R7 i
- }1 l' h% Y$ J7 P" e
- }
$ b* J' T+ j5 U9 X% E; T - })
3 m# d8 x0 E3 ^- O" E2 b - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
' G- ~# ~. o% r 钩子函数参数钩子函数的参数有: - 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 }。6 l. z- R5 G" f' q, I
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。0 K1 q* } h. ?1 n; H' A ^" _5 D) k
以下实例演示了这些参数的使用: 实例4 s, c4 w0 \$ k3 c8 I& Q. }
6 \' `6 S1 Z7 E8 c, v7 l+ {; G% L- <div id="app" v-runoob:hello.a.b="message">- H6 i" L) G8 l) f" |7 A
- </div>
" J6 q w [3 Y5 e' _, L% X -
, O( N) `( o. k9 K. ~ - <script>
- Q$ {! P9 H$ V. S) n! X; ^4 N( ~ - Vue.directive('runoob', {
! C; ~' X5 i" D) \( t& i8 X& g5 g - bind: function (el, binding, vnode) {
2 ~' T6 `4 T) S2 z- u# ` G" W5 E - var s = JSON.stringify4 p" D/ U5 W8 J; I2 _! l
- el.innerHTML =
% o' I6 W2 g/ ^" ` - 'name: ' + s(binding.name) + '<br>' +; g; Q2 a* x7 v/ @
- 'value: ' + s(binding.value) + '<br>' +
$ A) j# u. B3 ?3 W - 'expression: ' + s(binding.expression) + '<br>' +
0 V1 @0 E3 R/ V7 f - 'argument: ' + s(binding.arg) + '<br>' +
0 _6 W% w7 H3 j7 ~, T# p3 { - 'modifiers: ' + s(binding.modifiers) + '<br>' +2 G+ o2 f6 u" w2 H
- 'vnode keys: ' + Object.keys(vnode).join(', ')3 P+ a( J& R3 K6 G8 n% u7 Q
- }
' x3 U1 j/ ]% H1 b, U6 d - })
" J; o& A4 B3 ?6 Y% d, [4 ? - new Vue({
6 j# T6 `8 M/ v8 L1 E - el: '#app',
$ p3 X. D, j" C0 X& o, z9 c a - data: {4 P$ {9 e V" i
- message: '菜鸟教程!'
1 o2 \' P7 U4 g/ y - }
# r- {$ ]$ r9 Y8 a - }), m& g% L% K& { o" u3 q* C4 n4 Z8 J) `: n
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:, m+ y0 q1 S% B: \ F% C7 X! Z
- Vue.directive('runoob', function (el, binding) {. z, v6 `$ t1 _( X
- // 设置指令的背景颜色" a' X- {/ I, C0 _' w
- el.style.backgroundColor = binding.value.color) K8 F) m. A# [; B( a: w* l
- })
复制代码 . l k/ ^( `- i. F- j% _. Y1 d
( g; b- s) I! G4 j4 S+ j指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例6 H% |3 z$ J4 t8 ]7 c' E6 C
+ n5 I% H8 r9 a- <div id="app">
4 O' I1 I2 ~8 D2 |( W! k! c5 `9 @0 | - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
% J8 w7 {( o0 z' y0 `+ w% E - </div>
3 I3 c! V4 t l! P! n -
; _4 I# H" w$ Z' c! z$ n - <script>$ D- Y- X+ R0 \7 K' K) ]& d
- Vue.directive('runoob', function (el, binding) {4 C6 p, x8 E/ u# B* d# K, c
- // 简写方式设置文本及背景颜色+ l: |* t8 _* \3 C7 |
- el.innerHTML = binding.value.text
% v5 Z* g8 [0 p( h! q; U! j; P - el.style.backgroundColor = binding.value.color
, m5 g" w$ P& F/ u - })
% Z. y) M* r) _' f% ? - new Vue({
9 q7 U/ @+ Z$ o/ n, D5 X. Q - el: '#app'
1 J2 q* z- h! S5 ^' V4 k7 \( v - })
9 M s0 E A0 w3 m# a5 { - </script>
复制代码 + J. ?* `# p" a* N9 [& Y
& Y6 y4 r8 [+ t8 J0 }% _5 W6 d
: Y' i* b G- {8 I |