% P2 E' F4 @1 g
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
8 p! m5 s5 w6 d+ i! S9 k, z* Z; \+ T0 d% o1 h8 d( I) U# v
- <div id="app">' p$ l( j- K! e* w
- <p>页面载入时,input 元素自动获取焦点:</p>
. J2 l9 c5 H h3 \2 F0 A - <input v-focus>
9 P9 A+ s, f, ?/ n/ K. k - </div>
+ d& N2 r4 i- Y6 a; Q% x -
0 l* a+ I0 J7 H6 t! t2 h a - <script>
7 {2 }0 J9 r/ k - // 注册一个全局自定义指令 v-focus( h' q) u3 a. B1 }: W
- Vue.directive('focus', {
6 i/ J) f# D: a/ l& g - // 当绑定元素插入到 DOM 中。
* p5 A0 b; Y* r9 p, N - inserted: function (el) {# T% y7 z: ?0 H
- // 聚焦元素2 Y0 `4 N2 b( r/ Z/ j( U( ?$ ]
- el.focus()
7 D$ T# I& l) s1 v - }
+ W7 C& p9 u: z - })4 }# W) B0 G$ _* S
- // 创建根实例
8 n3 s8 D; L9 w8 N' q - new Vue({, U/ s; {, \4 V- j0 U2 p
- el: '#app'
3 O! O" \4 g( v' ] - })
/ i9 y! F" q; d( U' Z - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
& h# P1 @6 |) `8 s- C3 L2 v3 V( m3 z7 A4 p, A* i0 I
- <div id="app">
# D, J! I8 K: Y# e - <p>页面载入时,input 元素自动获取焦点:</p>/ b9 Q7 f2 O0 ~$ G% M8 ]6 E8 }( q
- <input v-focus>
! N I$ }0 ?7 V& @; B3 | - </div>4 I- a* m) k( T( H- r
- 6 r8 i. Y; W# B8 h2 K' H
- <script>
( \& [) C! X. V: s# H3 \ \ - // 创建根实例
" j2 K; m* E" J# t N+ H9 y - new Vue({
/ N$ D: b" ?; I - el: '#app',
( G: _9 d/ C, Q - directives: {
7 J3 S0 T Q& _* ^ N6 }; b - // 注册一个局部的自定义指令 v-focus
# m9 p. O* D [& r9 R5 }+ V { - focus: {: E, h2 `* C& i9 M4 y
- // 指令的定义
5 N) |- Q5 T& X r4 ]0 |( u; n' ~ - inserted: function (el) {! w2 A( I( I( b* n* A$ K2 A. o
- // 聚焦元素
' v: ~9 {* T2 z5 ` - el.focus()5 ]- E$ V& ?2 }; z3 ~8 J
- }
( W6 @' o7 q; w3 K3 M" A3 r - }3 Z: H) ?' |; v" c, {' ~1 M9 @
- }. i/ n3 t5 L# O T6 H
- })
9 J# \+ T: y" x* F3 k2 m% ~1 z( H - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
9 w7 g4 T% e0 \ 钩子函数参数钩子函数的参数有: - 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 }。
5 X) o5 T! Q4 |, {9 w2 P
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
8 ]3 l Q% J# g
以下实例演示了这些参数的使用: 实例9 M# n5 U3 P" ?1 N2 |; l
+ z! m5 r0 O$ Y
- <div id="app" v-runoob:hello.a.b="message">4 W% P: C g% V% x
- </div>
5 ?0 W4 K( o* z) K/ r( C9 |! y -
i; S8 n5 n8 A8 } - <script>
1 o' m/ ]& q" V, |3 S R+ \ - Vue.directive('runoob', {
) w* l$ Q1 z5 G* q" Y$ q - bind: function (el, binding, vnode) {
7 R- ^$ U8 R. k+ X" }9 F% i - var s = JSON.stringify; L5 b9 |5 k9 N% R. ~
- el.innerHTML =
$ Y# P6 d4 m8 o! J - 'name: ' + s(binding.name) + '<br>' +1 `: c" Z8 t7 [+ ^: F; g
- 'value: ' + s(binding.value) + '<br>' +# N4 O8 Y5 O& \$ N9 M- W2 ^+ ^! A
- 'expression: ' + s(binding.expression) + '<br>' +6 r% N, b4 H8 Q
- 'argument: ' + s(binding.arg) + '<br>' +
& y/ A& R5 A) W* F4 o - 'modifiers: ' + s(binding.modifiers) + '<br>' +
7 d4 _& w0 t& F# G. C" k - 'vnode keys: ' + Object.keys(vnode).join(', ')
4 |$ O( b, {5 T5 q, T - }0 I6 V; h }+ f, \
- })- P+ v! L, x# g$ c
- new Vue({
- I; x/ H4 }' c0 k8 h - el: '#app',7 e; k6 I6 Y0 ]' l
- data: {4 I3 _2 D" h) X
- message: '菜鸟教程!'1 s6 V0 u {' F# q* m
- }6 W" h% ~+ o5 [1 ]0 `. H
- })
. w3 W: {, x( }: f- ]8 _% ^9 ^* J - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:. M5 s! f2 f* W% |) H2 _
- Vue.directive('runoob', function (el, binding) {
0 E8 a, i! j! H* B# k+ C - // 设置指令的背景颜色/ W4 ~ z+ d2 G
- el.style.backgroundColor = binding.value.color+ s$ H* B ^( h. U8 z
- })
复制代码
5 a0 j/ ?/ m5 V! ?5 g/ x) w4 c& C
7 ]$ B/ L' r7 X" q9 \9 s9 B指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例- {6 @- }- Z- @+ B! n8 _5 N; u" r
1 w, O( S, K; W
- <div id="app">. G( G( @$ \4 s
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
9 o$ |5 x# C- D9 E - </div>
?( s/ |- V; {2 n( O I& a/ [ -
/ ?1 p5 G7 e( u - <script>
. |* N/ M* n+ @) q0 c - Vue.directive('runoob', function (el, binding) {+ `7 S: g( L2 t$ E0 C4 u: n
- // 简写方式设置文本及背景颜色
6 V$ Y* t$ R! u" I - el.innerHTML = binding.value.text0 o# M% N: K- R' p a8 b
- el.style.backgroundColor = binding.value.color( p+ O2 E- Q6 h! d4 X6 ~: Q1 Y3 h- ^
- })
% e" M, z( A3 d e# f - new Vue({2 o% i3 Z. E1 a, g! N% K$ z
- el: '#app'* e% u& S& i5 D, b9 F$ n+ ~8 Z
- })9 H+ L- G. y4 N! M' u$ J+ T2 [
- </script>
复制代码 6 @ Q8 M/ H0 e
+ O1 k+ L- ?& W( Q% B, X( E
5 f! b; I8 O, X) Q. v2 T0 `) @/ D3 } |