. s/ W, d1 A, z/ r( ^2 o) k& t% u
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例' I* F. z9 _0 }
% h/ B! U' m, Z5 X j
- <div id="app">9 ^( @0 {6 p( ?. U7 ^; ^1 a% q; l# Z
- <p>页面载入时,input 元素自动获取焦点:</p>9 V2 B0 W; i4 C8 K) D% V# H
- <input v-focus>% a& i8 N5 x; }! `0 ?) y
- </div>
' u9 }2 U( r0 _ X H - 8 |) c" x/ i3 p9 e/ k e7 e
- <script>" `, G# D3 X* e( M
- // 注册一个全局自定义指令 v-focus
& |% b' G! n$ N4 R3 m* D, |) e - Vue.directive('focus', {
/ z+ O4 Z( j) f7 ]& g - // 当绑定元素插入到 DOM 中。2 j7 @4 j7 h, h
- inserted: function (el) {
& w5 T; D' `9 o9 D1 I - // 聚焦元素. G. M6 j$ d1 A- W
- el.focus()
/ G4 z8 q! j5 J: z( S/ { - }
5 @% H. j9 Q5 o9 h9 T - })
# A1 @$ Q3 t/ I7 Q5 y1 M Z$ \ - // 创建根实例; P1 K0 e9 H& W$ a3 w g; u
- new Vue({8 Q k9 r1 j! }2 B. C
- el: '#app'
5 ^, O/ U h1 m5 { - }); W4 M5 o% f+ r1 u$ |3 P. X
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
8 p- T9 X' V+ G" ?2 n! [
/ y6 x7 I$ b7 ?; B- <div id="app"> X5 f; u; t( T) z5 i! U6 h9 A
- <p>页面载入时,input 元素自动获取焦点:</p>
- _1 ?! {9 p, i, J6 _3 b2 D! B - <input v-focus>2 L# Q- P$ h; Z5 e, H9 O( q% \# {
- </div>
2 _5 _; n5 }' W5 a, t' k - _# e9 e/ m7 \" ]
- <script>
3 |' v4 K) m5 }& N ^& e- O - // 创建根实例
+ a2 r- n" n* J( O - new Vue({
4 v# P) ~0 Y0 `$ C+ m A - el: '#app',7 d$ `# N8 J0 m% d5 |3 R) O
- directives: {( s7 d2 [7 U! @; u8 F0 x v
- // 注册一个局部的自定义指令 v-focus/ s- m) w+ `8 m2 T7 ]- }) f4 D
- focus: {" f+ S) b" H$ i1 p
- // 指令的定义; H4 t: o6 \. ^+ }) w X
- inserted: function (el) {& E4 e) E: s6 d) C, l) M
- // 聚焦元素
3 k% B. u2 x3 m- k$ |. P- r4 k) J - el.focus()/ U( _& `$ t1 ` b5 a$ v& c
- }
2 ?6 M* g, d3 @& | - }
9 ]; b, T4 P9 q! ^4 F - }; {: V8 F* o& q6 K4 \# y
- })
0 b5 e" B0 R t6 c/ ]% a7 T. x( ]" [ - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
3 L# a+ h h) u$ U' i/ l/ G 钩子函数参数钩子函数的参数有: - 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 }。
* Q1 Q2 k5 i7 D
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
V" N1 @# l! s, E
以下实例演示了这些参数的使用: 实例
* e( \: ~# A0 J( A8 [; V) U z
4 |4 r6 N6 Q4 d- <div id="app" v-runoob:hello.a.b="message">
! J& z. C- S: m# Z. I$ S; t& k# m - </div>; u8 C/ @) K: X: g- Z) Y& V, u, x
- 4 w6 b3 x6 C0 u4 S( B$ s
- <script>7 ]! T+ [( o8 R- G+ |. C
- Vue.directive('runoob', {$ N( m9 ^9 _: F( ~
- bind: function (el, binding, vnode) {) j$ A, x* T3 B( M+ N5 b2 w
- var s = JSON.stringify
; n, S: l) P! I) ~ - el.innerHTML =
i- M/ s4 i# u% ]- ~+ S( U. T - 'name: ' + s(binding.name) + '<br>' +$ H+ ], u3 t9 h$ D7 G1 n0 {
- 'value: ' + s(binding.value) + '<br>' +
6 F4 S4 T+ U* i - 'expression: ' + s(binding.expression) + '<br>' +
2 }: J9 D* N0 o: K; x; b - 'argument: ' + s(binding.arg) + '<br>' +7 a, P& g8 F* W& C# ]
- 'modifiers: ' + s(binding.modifiers) + '<br>' +! ?7 o1 q, |$ W2 }2 C* Z
- 'vnode keys: ' + Object.keys(vnode).join(', ')5 K4 ]9 D- ]! J6 }6 `
- }4 G; V# H8 C# q, h/ F1 {. a# R+ i' z
- })3 j+ G- `2 z. v
- new Vue({
" F" {3 y& c$ t \' x5 ~. | - el: '#app',% \0 E8 \- A4 W9 ^7 c0 d
- data: {
6 w {$ x# m) O) a& N, w$ Z - message: '菜鸟教程!') j$ X2 F" U% J+ H( l8 l1 m
- }
. q7 m( S* a+ A - })
" B! `" A/ R( G7 C+ T+ N: X - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:2 N! K. @3 K& Y7 W/ k; w* `
- Vue.directive('runoob', function (el, binding) {# f" u j( w J7 J9 ~
- // 设置指令的背景颜色
9 I9 ?9 Y$ ^7 e" R - el.style.backgroundColor = binding.value.color
# ?! Z. q6 z3 K6 Y6 l - })
复制代码
4 G1 ]# b4 f1 f" Q$ l! b( r( U# P# Q3 Y5 f. @
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
$ i! `* m; |6 N/ V( {$ f! V# K
% j6 ~2 B; E; H% Q- <div id="app">
, Q, `6 Z1 Q8 B$ l - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
5 J; F( G9 Q/ w/ a - </div>
5 j- W) _1 k( i% ?2 C' W2 O6 ~ -
! O/ d5 P0 j, S8 `1 X3 f - <script>
0 C! o" E% ?1 u M, d3 J$ z - Vue.directive('runoob', function (el, binding) {
O2 T( F5 J- z# } - // 简写方式设置文本及背景颜色
( W9 @0 d8 ~& }; Z, _( V - el.innerHTML = binding.value.text" A& G/ r! x! g& [; |
- el.style.backgroundColor = binding.value.color8 S8 w: N0 U$ s. `# e4 b; m
- })
% z. v7 o. V2 G' m - new Vue({3 Z. B) b: q; x. G* C8 o
- el: '#app'
% v0 A: h7 c9 I1 _9 Q( I/ o& B - })! }# U% b3 a9 n* o7 r" F
- </script>
复制代码 ) ^: A# z/ U( p* `1 v6 ?1 q
1 T P/ h1 [+ W0 r
0 j$ Q0 \% _. _+ [ _
|