( K) K/ M k" k8 ]- n' G除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
1 b5 m) `" D. ]( A
- W6 l) P1 M9 s8 }, D- <div id="app">9 i# n) n: d7 w4 o. B
- <p>页面载入时,input 元素自动获取焦点:</p>
4 l, q% t0 u$ k. {) o0 u - <input v-focus>
" f/ m# n4 k! v% { - </div>
( e6 s3 t. \* P- S, J8 B6 N0 h' A -
+ X3 z" f, L- D2 P# p R - <script>& _5 u2 P* X/ k: g+ w
- // 注册一个全局自定义指令 v-focus- s f7 Q3 I! w' O, x
- Vue.directive('focus', {! p9 m; Q* F D, w$ {
- // 当绑定元素插入到 DOM 中。0 d/ k2 m5 I. k; M3 p
- inserted: function (el) {
+ K7 ^" O' C" Q7 I0 ?* b - // 聚焦元素4 R/ D( C; k' O" i0 f1 y
- el.focus()' H9 K9 n( F! }: U v
- }
2 E- i/ m. M1 e D% w0 p# p4 H - })
: D( G% f; M, S6 m+ m( v( d - // 创建根实例
* }2 U: O5 e' ]6 L, q - new Vue({( x/ D8 J$ Q: H. E* J
- el: '#app'
l$ \. Q. f$ |2 E0 @) z - })/ A; P# P! ~: a8 C+ l8 |
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例" y8 h* c1 ?+ M6 q0 T
7 x9 z. h% M2 d. P
- <div id="app">
% q4 K6 v. A" ?. {2 s - <p>页面载入时,input 元素自动获取焦点:</p>
8 h ~! C$ q. Z; t4 \- u - <input v-focus># p7 ]( t! E9 ^ j# N
- </div>
3 B9 T: ?1 S. ] A9 U1 l5 s* \ -
% c% c0 M% B. C& h% R4 C$ { - <script>% i5 V- v8 B2 r
- // 创建根实例1 @ D* R$ N! g. q0 r5 C. J5 S
- new Vue({- J$ C; x* T3 o* V+ b) h7 M0 i- k
- el: '#app',/ o' s1 h# Y- W0 H2 \& n/ {
- directives: {
# s( n8 c7 Y1 E: U1 ]1 F5 \. a - // 注册一个局部的自定义指令 v-focus
# q8 t/ i: o/ P! P P; |& B - focus: {
( U9 p5 x9 l, j* e0 `2 F - // 指令的定义
7 N' R2 L N0 D- z) E: l - inserted: function (el) {3 [! Q. M2 ?& u9 \* L
- // 聚焦元素( X' s2 Z4 d# |, p! }
- el.focus()
/ J8 H) x: l, t" t1 C# Y+ b+ ^ - }) K. o. o! R6 g' h9 ^- f
- }, J7 T( z" J z/ K
- }
+ E3 k+ M8 }0 f9 G) ? - })
; z6 f1 D1 y9 a. o( f - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 7 _* i8 }$ m, U/ [! m) d8 V6 _/ f
钩子函数参数钩子函数的参数有: - 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 }。
! K+ c* j. d1 a8 `8 f* }1 R- }
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
5 E: q0 |$ M5 J/ K# C' b; E" ]
以下实例演示了这些参数的使用: 实例7 g6 ]( [& K! X, L0 p0 {( F
1 {& a0 X3 y0 y Z3 y: Y
- <div id="app" v-runoob:hello.a.b="message">5 E) @+ H& p& p9 Q x* m% g' d
- </div>: G" L3 Y5 t9 y/ |2 j! a; ^) o" \( K2 t+ b
- 6 E2 \( I: A3 N2 \
- <script>
( [# A4 }0 E4 [% @4 H; P4 O$ O - Vue.directive('runoob', {
- I5 w; H* ~* j1 M1 e3 k2 s - bind: function (el, binding, vnode) {, I+ P* `4 L6 c$ x. Q! e
- var s = JSON.stringify8 A& f: _# ~* G* }
- el.innerHTML = B' ^( [; I1 n4 i( _
- 'name: ' + s(binding.name) + '<br>' +
! K3 k! t/ K, Z$ u' v* r - 'value: ' + s(binding.value) + '<br>' +$ {! S. n1 _$ W, f# m
- 'expression: ' + s(binding.expression) + '<br>' +! K4 W9 t& M S
- 'argument: ' + s(binding.arg) + '<br>' +
; ^' F" p6 U! \4 P* u+ Y* G - 'modifiers: ' + s(binding.modifiers) + '<br>' +" g: {8 P, H( O5 n
- 'vnode keys: ' + Object.keys(vnode).join(', ')7 |+ n4 v9 S+ X; a
- }
- f" E! o9 G6 \7 z9 ~& }* _ E - })7 Y& { k* \3 J# ~ L/ E4 m2 ]
- new Vue({
, i" Z/ ^& U% v$ s s* V - el: '#app',
" A! t1 ?* S/ s/ [- V b+ y3 F5 F - data: {
1 A7 @; V6 c; i0 P! ?. h4 j( M( o - message: '菜鸟教程!'9 y; N$ V" p9 a! O8 \ _( U$ L
- }2 J4 ~/ J, p3 T) {
- })
4 u3 q3 W) j. @9 J; s" g/ ~- \5 _5 f - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:5 Y) i y) w/ ^% a4 F+ `1 X
- Vue.directive('runoob', function (el, binding) {) @: w$ [4 Y- ^. \' q
- // 设置指令的背景颜色) n/ D: B" D9 L$ z. E! x
- el.style.backgroundColor = binding.value.color
3 T. F7 X, Q+ E' o5 M - })
复制代码
5 L' ^' J M: f, W, t% M' w" z2 u9 p2 q4 {4 @. T# {- ]
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例6 f: y4 {+ |" X# ~% }+ O6 f4 C- Q' r
+ w% }- B$ R& M4 E: A
- <div id="app">
. |& X" n2 O7 Z, c! I: W - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
& P( K6 i8 N4 Q& x* d) S - </div> F" T' @' O( x
- 5 x* x4 q% l9 K( S
- <script>
- ]* g: V! H( z J - Vue.directive('runoob', function (el, binding) {& O" t* E$ V8 E" ^9 v$ W u3 U0 m
- // 简写方式设置文本及背景颜色
7 i4 F: F0 k8 g4 _ - el.innerHTML = binding.value.text% S: W! I; Z3 o
- el.style.backgroundColor = binding.value.color
9 q. }, y% _' q# Z) |/ C& n% a - })
! J K7 c6 s" f5 Z" Z - new Vue({$ i) F3 t5 t3 I! N
- el: '#app'. B# S' c* H, k- _
- })
. U6 f. b% }# Q - </script>
复制代码 / Y2 s, q1 t- R" i8 g6 e0 N: e1 K
. F& _/ c2 l$ m) f$ k
( n0 _" c% q% L3 d. W |