: G5 \6 F- k2 r! _9 Q" F0 ~- \4 I除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
7 x, J9 l4 b* A7 }5 W- P8 f
( B# |5 Z4 Z/ r* z- <div id="app">
! e# ?% g7 ~$ e; y - <p>页面载入时,input 元素自动获取焦点:</p>
1 \$ |7 y4 A! |/ M$ _6 A4 L - <input v-focus>" `, C$ t9 e: M- G
- </div>
- N% s+ K3 o/ v, G8 n. o2 b! f8 z - ; c: F; S a+ W
- <script>7 e, ^5 f$ ?( z# q9 F
- // 注册一个全局自定义指令 v-focus
/ }4 A( O- N- j4 @' M/ i3 s4 L* R' X - Vue.directive('focus', {+ Z% \' V o' `: S1 [
- // 当绑定元素插入到 DOM 中。
& o @+ Z$ |) M. ?8 U$ B J$ A* D - inserted: function (el) { p) }2 F4 F V2 H; ]. k
- // 聚焦元素9 h; J: S1 [) i! b
- el.focus()- }8 |, P5 h, ~+ ]8 T& K6 V
- }
3 b2 P1 u& A$ ^/ s( P3 g - })
2 q7 @- O E1 ^8 U4 ~4 s1 K0 ] - // 创建根实例
) ]& ~, Q) L. p8 o. q - new Vue({4 q( t! D4 _# o" I: ~' j, M( {
- el: '#app'
! R. C) l) X: K - })
2 j( J# Q/ L* T" ?0 T+ c - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
$ f; b, s6 g! j4 \- q
- C# L% P0 n( `* ~- [; N% g0 H. S- <div id="app"> n3 G+ E E# w1 b4 |3 X0 T' H0 e% u
- <p>页面载入时,input 元素自动获取焦点:</p>) g' c$ r+ Q, K. Q* }
- <input v-focus>! D9 c# O: ?& h) J
- </div>: A" H8 |+ |1 h% o, ^
- 6 d* c, u' a; v( W& _
- <script>& H" w- C; [1 w
- // 创建根实例
; f( _, h8 C" l3 } - new Vue({
z) n, e" u; ^" D) ~ ]; O - el: '#app',/ e) ^5 v/ E3 }- I# n- x7 \- s
- directives: {
# H- C* o! p) b4 H - // 注册一个局部的自定义指令 v-focus- V8 _5 w( Z$ @( j; A
- focus: {% h0 ~2 j. J9 j$ g0 N8 E2 S
- // 指令的定义
* o. v X# i$ h5 o1 `, S - inserted: function (el) {
- E* A' W4 e% X; q2 Z$ `( V: p - // 聚焦元素
2 {# T, p/ l/ w- r/ M9 v - el.focus()0 s& D1 f- c, d/ T- R
- }5 H6 R3 W- M( Y/ y9 z
- }
( O5 b' r1 Z! ]- V4 R - }) C1 c4 K9 Z4 |: M: [9 V
- })! j4 Z# h9 n, ~( e/ ?2 _
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
" k8 }" \* ]# v' _0 N$ [ 钩子函数参数钩子函数的参数有: - 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 }。* z; K* b2 s. w1 m G. p v
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
, l" N* B! M. q) p6 \/ _9 m
以下实例演示了这些参数的使用: 实例
2 a# x0 j( H- ]4 R- i+ n. w3 q, P. m3 t( l2 w4 @. e
- <div id="app" v-runoob:hello.a.b="message">, d2 t: w# k4 J# J* `7 R
- </div>
$ F+ O$ f' d6 l, `+ {% u -
% q5 H: L, a T0 A2 G- ~1 E# M - <script>& f0 { @3 L% X1 B
- Vue.directive('runoob', {
$ }* Y: @! f B8 k+ y: @7 l - bind: function (el, binding, vnode) {# p; \9 z& U# Z" Y: p
- var s = JSON.stringify! Q7 @: T- `5 a: O. H0 M+ k
- el.innerHTML =! o6 l& r* O/ y! y6 V6 C% A& z
- 'name: ' + s(binding.name) + '<br>' +$ F3 p8 L1 _% b) Q% I
- 'value: ' + s(binding.value) + '<br>' +" B7 Q6 l% R3 l
- 'expression: ' + s(binding.expression) + '<br>' +
( \% S0 I" p3 Z, C- ~ - 'argument: ' + s(binding.arg) + '<br>' +
( E3 Z4 N' V) s- t2 W! Q' Y+ i - 'modifiers: ' + s(binding.modifiers) + '<br>' +
1 D7 D4 I \5 B6 H! F( ^ - 'vnode keys: ' + Object.keys(vnode).join(', ')
+ z2 S2 s9 q/ ^ - }
% c5 |6 v& O$ c% I, l - }), |. w {; O# J0 ?& v
- new Vue({) y3 O' N" X! n7 m6 @# D+ T
- el: '#app', h+ m5 \/ E) c4 P, c/ T
- data: {
[: k7 q0 c! U6 f- q - message: '菜鸟教程!'4 |2 ?+ x8 S1 p6 l2 c
- }
0 m6 U: |! s( j - })1 H2 k1 C" O0 } C2 \+ \
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:8 u+ ?6 r6 D1 a
- Vue.directive('runoob', function (el, binding) {: {. L) b6 i2 `. \- K$ L
- // 设置指令的背景颜色
3 s: c0 k/ D# e7 n6 c# \) ~ - el.style.backgroundColor = binding.value.color
( h- Y4 G" S, | - })
复制代码
8 x% e4 K7 D9 {
6 S& U. D( B$ U- U; C$ O! U+ ?指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
3 @" C( `$ v# r7 ]2 m$ ]. R) e5 a' E
' h- t+ y2 n- e2 j9 N( i- b- <div id="app">
: B, X5 `9 o) W7 t1 c - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
, T0 u( G" T0 N3 y' c - </div>
/ [( D$ v3 g0 |" v9 o: o -
$ D0 ]" {& X* m2 | - <script>
# v7 d6 f& S, k, W9 ]" K - Vue.directive('runoob', function (el, binding) {
$ ^- T& e. s+ G, f - // 简写方式设置文本及背景颜色6 u; A' a) A6 L# ?
- el.innerHTML = binding.value.text ]) a- E- x6 a. u
- el.style.backgroundColor = binding.value.color+ P' a7 n0 E7 m- O, `8 M
- })% f) Y1 m$ ^- e9 d
- new Vue({# T1 k' _# _! {5 c1 d
- el: '#app'
3 r" F" o! F% O - })
% F' _& y. z, r: t; J; N: j - </script>
复制代码
6 F' @) B: q* `. e7 q0 F& d- P" ~' H0 F1 j1 |9 o6 k; s) V
3 ?1 `2 o2 m7 R8 F5 m3 z( f" B
|