: u& H, q0 J; [除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例- K) }0 @* [) U: `" _& e( ^8 C
6 o; |& b4 E$ @# y8 N; u. e- <div id="app"># k7 y8 ]; P8 a5 v
- <p>页面载入时,input 元素自动获取焦点:</p>
) e/ A# w& e8 `2 B; J6 [3 W* J - <input v-focus>2 |, E! H5 P8 _& a6 E& H- ?. I4 X
- </div>. C* Q3 O( W5 f7 P. {
-
" i3 h4 C: Q. j" P2 L" _8 w - <script>" I* s/ b$ O P( N, E
- // 注册一个全局自定义指令 v-focus$ ^7 }$ D9 P0 v9 { T- z6 W. J
- Vue.directive('focus', {* D! `. _' G3 |9 J' W2 X
- // 当绑定元素插入到 DOM 中。
3 o# h- g) \# Z6 N0 d5 d; K - inserted: function (el) {
8 E6 n+ Z+ |/ F6 f; u" X+ b. d - // 聚焦元素1 u5 c8 b. r5 w6 F
- el.focus()
* c, Q- T$ R) ~# b - }* k/ V; i# u' i% d3 A3 [9 E. W
- })
; l5 `% L. w9 q; Q - // 创建根实例
. F: z# B9 W/ J! I - new Vue({
! ~: O( U3 T, D" t - el: '#app'
+ U, R. u- H6 \* s - })8 F: Y- K) p% U9 A v
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
# U. {# k z+ s8 c9 _/ _1 }4 ~% N7 k, _
- <div id="app">
6 p* R: n7 J$ O/ r( p' r, f3 ?: E- Q - <p>页面载入时,input 元素自动获取焦点:</p>
6 e6 x8 {. a' B8 z - <input v-focus>6 d, i5 O0 \" e1 P4 A
- </div>5 j# H0 ~. J& e0 x1 F, B4 Z- r% [2 G
- ! u" U; h) C7 A3 S0 E* k
- <script>. P% e5 [2 _5 G2 i( O# S3 |
- // 创建根实例
1 w' v( K6 l7 i6 J - new Vue({' G0 Z4 n0 X6 P4 z
- el: '#app'," N: p! L4 ]% c, N
- directives: {
b& s7 X3 t$ v6 \" g7 u3 F - // 注册一个局部的自定义指令 v-focus; ^0 u# I V# a6 y f" y
- focus: {8 w6 W- N- i7 g1 I; O
- // 指令的定义
% _9 y) v0 @: j7 q' i - inserted: function (el) {. V! g9 I2 C: W9 I, {8 ~8 F
- // 聚焦元素/ G7 n6 K6 V7 u
- el.focus()/ o, @3 v; L( ?) l) C+ @2 R# F
- }
# B+ k7 w5 Q6 f4 H8 } - }% @4 H N$ Y2 p" T' T( a) z. @ h( }
- }
1 W$ x% v- x( Z - })0 \: j/ O6 [9 Z8 U1 M
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 + |+ G1 T3 a8 u2 D3 \
钩子函数参数钩子函数的参数有: - 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 }。+ P5 h. o7 h& ~- r& X
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。8 Y6 O. A3 ~8 S5 `
以下实例演示了这些参数的使用: 实例8 q" T; o' d/ P* ^
, O9 N" Y5 |: q _/ i$ S
- <div id="app" v-runoob:hello.a.b="message">
0 B) R! E: k5 Y# G$ i - </div>
! P2 P. i, { I6 F - 5 z9 s) S' Z2 G. w }7 i
- <script>
" Q2 m# j; z) [8 D - Vue.directive('runoob', {7 U8 S2 s6 P6 R; X! E
- bind: function (el, binding, vnode) {
3 C. x. I( T6 I. G+ w - var s = JSON.stringify4 t. ~/ U' d) D. Q% B$ p1 e
- el.innerHTML =0 C a7 F9 g- W1 ]
- 'name: ' + s(binding.name) + '<br>' +7 ^2 U- A% x0 O- U& t6 T, Y
- 'value: ' + s(binding.value) + '<br>' +
: g9 v" M! N- M) B - 'expression: ' + s(binding.expression) + '<br>' +& Z8 _$ F* \% r& v1 Y( b Q
- 'argument: ' + s(binding.arg) + '<br>' +
* M7 B3 W1 ]4 S6 a! o - 'modifiers: ' + s(binding.modifiers) + '<br>' +
" V' d. }: j) X" t& Z - 'vnode keys: ' + Object.keys(vnode).join(', ')
; q& |- E9 O) ^) E - }+ Y/ g: ~0 X9 s. I% E3 X
- })
/ T# D, X. y% H - new Vue({+ Q# z8 \1 \% z+ P
- el: '#app',/ t" r: Y, O) k* C, c4 s- J; C
- data: {1 N7 v- v m& ?
- message: '菜鸟教程!'
0 m- J" A: p: z4 o - }. K0 a- U4 g* S6 }; f. ^" B
- })
1 g5 p+ m% Y' t5 r; a6 S - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
4 U: x$ a! ^' @) E7 S- Vue.directive('runoob', function (el, binding) {" ?9 Z. y5 }$ j! e t4 J. o8 u! s
- // 设置指令的背景颜色4 p% \& V; z1 ]- C5 o) Z6 {4 |
- el.style.backgroundColor = binding.value.color
2 `& K+ k$ M& ~) V - })
复制代码 ! T; Y4 }( g5 W6 e0 o
; d4 T* f* H$ M# p% w# } w
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例4 d6 u7 E/ T& A% S9 y" ?' ` I
- K" {- ?5 w$ c9 L2 T- <div id="app">
0 D; J& y9 d3 e: W - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
& g3 b4 X* S& h1 a* C2 h+ N& k7 e2 T4 G - </div>
; m0 ?/ @( b- B% N3 [$ u& W( i - ( n7 r" y8 ^0 j) q! l3 y
- <script>1 v& L8 c/ r4 |
- Vue.directive('runoob', function (el, binding) {1 X# s" B4 i6 N% f
- // 简写方式设置文本及背景颜色8 o: A( g8 T, V# ?2 M+ f5 M4 w' h
- el.innerHTML = binding.value.text' z! t1 d2 t; U j6 A
- el.style.backgroundColor = binding.value.color, A* x' b5 g; H, E! [
- })
1 ^/ ~- ?1 {, C/ a/ j1 q# u% _ - new Vue({; }/ ?3 o" h& d; R$ [* s
- el: '#app'
' y" o& I( ~- E" E - })$ J- B! O/ x( ~ c
- </script>
复制代码 : ~& k' @+ x# d0 J/ F0 H6 r3 V
% _% p9 W+ ]2 p5 @; o- e) d7 @4 N5 ^* @
|