% O/ b9 C' A" R6 `- J除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例" [# X) C+ E7 b! Y4 W
+ t J6 i4 }* u
- <div id="app">
7 [% B3 l: a! @, d/ l - <p>页面载入时,input 元素自动获取焦点:</p>
5 ?1 E# L( l# j9 ?! z4 f/ S& M l - <input v-focus>" H! e: U" p/ z4 \
- </div>
9 B7 e. t# T6 S - 2 } y7 z d# Q9 g) r, P8 j `3 t
- <script>
! }, Q1 [: j$ v2 y+ z - // 注册一个全局自定义指令 v-focus
" ^: w9 b2 X5 i* ~% ^5 h1 ~ - Vue.directive('focus', {% r6 j1 D5 ~' ^- f& N# G
- // 当绑定元素插入到 DOM 中。1 b1 |3 H7 [) M$ P# X& {* d' H
- inserted: function (el) {7 t1 ` Y/ x' I3 K9 p6 C) f
- // 聚焦元素
- D- x1 C$ @1 x - el.focus()
" [# k# @9 @" \) ~/ a4 l - }" m" ?' l! ~9 Z4 g$ R
- })
9 ?6 K& q+ M1 D, X; e - // 创建根实例1 k3 o/ ]( |7 L+ a4 Z
- new Vue({$ M5 ?' M% a" a Z% t4 e" @
- el: '#app'* Q9 t+ E7 ~+ F4 R
- }). X8 h1 h4 u8 T% E* S
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
0 @; M$ z' y! t9 U- {% w* g6 @
$ V1 v: ]0 l. y- <div id="app">
% H$ V. M" n: D! p! e1 ~' g# a6 e6 e9 t - <p>页面载入时,input 元素自动获取焦点:</p>
# g6 r1 @- {# w - <input v-focus>/ S$ h- H f( T- r5 g; F/ t
- </div>! b* Y& x) }2 b# z6 u$ `7 w
- @, G% m- R, |4 q! M/ p
- <script>9 i! V+ ]+ P8 G% z: @
- // 创建根实例/ I, ` k: B0 V
- new Vue({
" M8 ?5 I+ G! n - el: '#app',4 W$ ~$ h- O" E( \
- directives: {
! P9 Z1 K( s2 _2 }5 R - // 注册一个局部的自定义指令 v-focus
) O: |, O2 g, n8 a$ ^( N. }: ? - focus: {- E0 b0 @/ j$ I
- // 指令的定义
6 k0 s8 ]/ h+ x2 ^* J% k u - inserted: function (el) {0 I; J% {! x( q- p1 I
- // 聚焦元素. ~* c- Y" [$ K
- el.focus()
9 n( j; B7 [( k; u- p0 r1 I - }+ u( v3 d0 |9 ]
- }& H. U1 a* |" j
- }
3 G. J& E: F% r2 x% m0 x; f - })- |7 E5 ^2 h5 H# |+ j( F7 B, O
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
7 ]* _7 u3 _; e+ S3 D5 a 钩子函数参数钩子函数的参数有: - 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 }。
' @/ e& p7 }& F
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。3 F& f: B2 R z% Z
以下实例演示了这些参数的使用: 实例1 D" R8 p5 g ?( E( a2 V1 f* V1 A
( W* R# s% T6 |$ u+ z' j7 l- <div id="app" v-runoob:hello.a.b="message">
% o2 y/ S, S1 V5 x! |' b* J - </div>' C4 n6 v( D: P% b) O7 g1 x
- " l. ?6 W7 }$ i l0 _
- <script>6 q6 a) V3 e) z- a2 M9 Z
- Vue.directive('runoob', {( L8 }" x; q- @) q
- bind: function (el, binding, vnode) {
0 u" W5 I) ]2 y7 D0 v# C - var s = JSON.stringify0 X" r+ t1 z, Z9 r ^7 ?. @
- el.innerHTML =0 Q# Z* g) |* o% Q
- 'name: ' + s(binding.name) + '<br>' +9 O" S% j! Q, F! G( J
- 'value: ' + s(binding.value) + '<br>' +/ ~$ W% S' o0 x" b# O
- 'expression: ' + s(binding.expression) + '<br>' +
+ ^2 r4 Z9 o) f9 ^ - 'argument: ' + s(binding.arg) + '<br>' +9 X8 n, Y1 O1 l
- 'modifiers: ' + s(binding.modifiers) + '<br>' +' {- @- x9 { \3 o! X
- 'vnode keys: ' + Object.keys(vnode).join(', ')
5 F- `1 N3 ?: M) o1 j# Q( I- c7 Y - } u, I$ z, a; I& x/ Z/ C7 I/ r
- })
; V: d* W) J) N' M. D$ F0 f - new Vue({
% Z' j; {( c. F" g) t - el: '#app',; d0 r- ^9 R/ @3 C' o4 z: n
- data: {
5 `# L' |) o9 h, Q2 S - message: '菜鸟教程!': `- F4 u7 T2 ?9 I1 s9 D
- }
: ?: r; G' o+ x$ w, K - })1 A7 `" |6 w, S( B& r0 R* C
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
- w' }7 n x) e/ W7 N+ U J- Vue.directive('runoob', function (el, binding) {
6 W. x' Z3 r& C. d - // 设置指令的背景颜色
3 P- G2 m4 U- Y! e6 Z - el.style.backgroundColor = binding.value.color' e0 d" ^! d& r: _, _- d
- })
复制代码
) {! b" N7 O7 F! V( P5 G u
7 \) g. \4 P( x$ l4 M! E指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
% c/ |* W5 |2 J& f7 `+ X% g) \) d: `/ L- z2 W9 S V) Z
- <div id="app">
5 H7 D7 p" l0 \0 d - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
; ?' H/ l& Z: d6 r - </div>! ?: S# B' a0 `3 H) e# _0 ]4 U5 Y
- $ Q E; Q; k" ]# z. {) M
- <script>+ u" A* U" `/ {; |6 @( Z2 Y1 Q) a: P
- Vue.directive('runoob', function (el, binding) {5 y; K! m" v' v0 l; e8 [6 y) H
- // 简写方式设置文本及背景颜色9 G" G5 R. Q: ^# u
- el.innerHTML = binding.value.text. O8 d# o2 h: b X* E1 E7 n
- el.style.backgroundColor = binding.value.color# z: A$ C6 W& j# Q2 o/ M* e/ B0 p9 u3 y
- }): O8 q2 F3 Q; k% S4 g
- new Vue({2 N$ M3 O$ E" ?
- el: '#app'
y% _, i+ G" b5 J' B- T - })
% j) N& `! C/ L3 h% K- Q! g - </script>
复制代码
' P6 q9 k& |8 l8 G8 K# g) N2 `8 k, M" k: A+ T
& a# z( ]$ i6 B! a
|