& W9 n9 A# K0 u除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例5 c) Y) R2 h6 }4 o: q5 n2 |
% S1 C9 o2 E8 D, I& \ i9 K4 d5 b
- <div id="app">
2 I/ _* K; ~1 ` - <p>页面载入时,input 元素自动获取焦点:</p>
0 C$ ]9 G, n- U- x, R q0 [1 w - <input v-focus>
/ n# p$ I2 I9 r- s - </div>
4 ^/ K& J1 U$ l, p6 { -
1 r$ ]" w$ R2 W' R) X6 t9 u- o - <script>9 G: _1 L4 h* V
- // 注册一个全局自定义指令 v-focus- k0 _: k2 v/ J8 d; l
- Vue.directive('focus', {
O3 |5 T% O: } - // 当绑定元素插入到 DOM 中。
5 z" I4 d8 b" w* ~: t6 k - inserted: function (el) {* X% k% w# @! ~* y! n+ n
- // 聚焦元素
, T% V, J2 [8 ~2 d" o: D2 g - el.focus()- \* K& d, ~2 H2 I+ p
- }/ i& v* m" L6 A
- })
) |$ y1 f/ c" l/ A7 k" c) q - // 创建根实例
; _$ c6 ?9 f. t% F @/ P: g/ e - new Vue({0 p9 W& t: Y/ e2 m1 g2 S
- el: '#app'4 X) l- d) F8 @3 z
- }), D( E: M4 H, n- b2 a9 j
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例2 ~* N* I5 R$ i6 L* y- e
' ?0 {% q6 j" i! m- <div id="app">* |8 h6 q R5 U9 D" a4 B3 Z' ]
- <p>页面载入时,input 元素自动获取焦点:</p>
r; h' u' M3 s* c; p3 A - <input v-focus>
- ^# O6 K8 b+ S- I7 f% i4 Y - </div>7 R& e4 x/ z& | M) J
- / H* m* u( w' U; |
- <script>7 _+ }5 Y/ H4 g1 [8 H4 z, ~4 n
- // 创建根实例
; N8 t$ R6 d9 O& c- j: R2 @ - new Vue({
! a' [% {$ U' X, E! q, G+ ]7 U. J - el: '#app',
3 ?# | ~! L ^. v/ J+ e+ @ - directives: {
( Q$ ~8 L7 `5 B' X5 `4 m - // 注册一个局部的自定义指令 v-focus
1 j, d5 l* J! G& e0 p$ a - focus: {" B- d8 D: o! k! L- ^7 L. @+ d
- // 指令的定义' P+ A( U4 z' A* ]: w$ J0 A/ ^
- inserted: function (el) {# C. `0 n+ ?; B5 e& y
- // 聚焦元素
1 a0 f+ U* Y9 D/ c: c9 h - el.focus()* ?8 ?$ ^/ E6 V! k
- }2 x& M# }# ~7 ~1 R! ?
- }
) i$ u9 W3 d8 F: |" N" v+ C, A" s - }
4 [. h$ @/ E! ~( O3 z+ }/ W# @( q$ @+ o - })
# J# O% u8 P; [ a. J/ s - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 2 ]- b6 s1 P! t: E( |
钩子函数参数钩子函数的参数有: - 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 }。3 `* J: f& p2 l4 I
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
' V" l; F Z: B) A! J
以下实例演示了这些参数的使用: 实例0 Q+ G& _ ?! p' D8 T$ c
8 d; z' L( o5 ]$ [2 Q/ E1 K
- <div id="app" v-runoob:hello.a.b="message">
# V ^' i {% ^" M; G - </div>0 K ?9 l& g5 j0 ]
-
Z+ A+ p. ?6 p0 j# x8 L# T - <script>' e7 D0 V+ Y# t8 |7 Y% d
- Vue.directive('runoob', {3 z$ r$ s% _; W3 P9 V/ w
- bind: function (el, binding, vnode) {
* R$ \+ i. x! d. N, [' B) b - var s = JSON.stringify
; J- X: o$ l9 B' s5 s6 L. M% s( @ - el.innerHTML =
* }' H0 ?2 k& g5 Y2 s: O - 'name: ' + s(binding.name) + '<br>' +
1 |% ~/ E, n: o/ { - 'value: ' + s(binding.value) + '<br>' +' a, P8 F6 `% f/ S$ K: f: [& e8 Y
- 'expression: ' + s(binding.expression) + '<br>' +
1 m/ ~' `0 x* ^) W6 h - 'argument: ' + s(binding.arg) + '<br>' +
! S! H& i5 m# C, F$ ~( ^8 |( x - 'modifiers: ' + s(binding.modifiers) + '<br>' +: K8 g& B" Z8 O }8 h
- 'vnode keys: ' + Object.keys(vnode).join(', '), d2 ]2 R3 A" R2 l2 D( L5 `
- }4 u" ?6 P, d( K: Y. m- X
- })
" o3 A% q& e8 F$ _ - new Vue({7 }' K! ?% E* s* W( B8 M0 b
- el: '#app',! }- T6 |2 j8 d/ L ]
- data: {( B# ^1 v/ f5 ^. R/ Z# X! ? \
- message: '菜鸟教程!'
( n `' K7 q2 @8 [ - }
! U |9 J4 s# o1 N: v' T1 } - })0 W; F' J; U/ e" m
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:) G5 e& S+ S5 m. N
- Vue.directive('runoob', function (el, binding) {, i/ ~+ A, z: I9 X
- // 设置指令的背景颜色+ h' A+ Z. ~: Z/ f
- el.style.backgroundColor = binding.value.color: v2 r1 H4 _& X
- })
复制代码 - M B! N# L1 t P2 E
& Q( G) U2 J* a2 W" z9 P
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例+ T9 O) s$ L8 S9 y+ a# Q
# { n7 d A8 l( a7 M
- <div id="app">
: b0 e; X2 |& T) z; F& f, V - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>4 V3 M# P$ v$ x1 Q8 S8 H
- </div>
% P. Y& M* d& t- N# h' L - # B, M j1 s) W9 p* @2 b
- <script>
* H1 |0 K- v3 ?4 \ - Vue.directive('runoob', function (el, binding) {9 I7 s* A, v" @; R: G
- // 简写方式设置文本及背景颜色. V. b; |" Q# _/ {1 s- b
- el.innerHTML = binding.value.text' G7 F# D$ d+ U8 V: u
- el.style.backgroundColor = binding.value.color
0 i0 z( D: Y+ a) K# q - })
/ D5 _9 ]% E# a1 |& b# @ - new Vue({$ y: c- L5 K0 X: [+ S* R; m' C
- el: '#app'* [% Y1 f# K& A* c& {: P4 }! S {, n
- })
9 K* d1 k8 o) g, p5 K - </script>
复制代码
2 p* q: G" S+ f. y4 w& ]! l; g( V5 T% c$ s6 `3 b" h
+ A/ U6 H' O; u |