' n& L. g: F! S/ l, i. E
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
. t+ r x, q, F7 q/ @
! T4 o* p. M& M/ h* {9 _- <div id="app">
" @1 y* n2 v4 g5 L# V8 B - <p>页面载入时,input 元素自动获取焦点:</p>4 v+ t4 o# o8 K/ W Q: G `) D
- <input v-focus>
% U6 w- w" V K% f - </div>
7 {+ w, F6 R" X2 M, L; `6 S7 `1 @ -
w' w. X! Z! u9 `9 d, P+ V - <script>: V+ f2 E" U/ e/ Y
- // 注册一个全局自定义指令 v-focus) G2 x2 J0 [: y" N: U: M7 ]
- Vue.directive('focus', {
3 ?: T1 g% e. b! C6 j3 l - // 当绑定元素插入到 DOM 中。9 {4 T8 s$ j% f/ o8 |5 ] P
- inserted: function (el) {
$ |; w' o% W' t/ @! G5 L) J7 ^# E - // 聚焦元素: g( T& ]( `3 v1 G- A( ~1 w8 a( k
- el.focus()
- d9 _$ Y8 x+ R8 Q0 t- G) i" [: D - }1 B6 C2 M3 D' ?
- })1 U7 z! P# T' @1 k9 _
- // 创建根实例) \5 G/ |) j. k
- new Vue({
0 h# n. @* U5 M9 S0 Y% H l - el: '#app'7 Z0 u% n$ `. a" }; P/ W4 z7 F
- })$ |' [: Z* |9 {/ v( }) I$ ~4 k+ W
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例4 C4 X( ?1 v0 L, A0 e# m
0 j4 r1 e! w( a# w1 K6 A- <div id="app">" }" g$ O5 i' O8 n% f+ d! V
- <p>页面载入时,input 元素自动获取焦点:</p>
1 w A9 q8 A) e; G- D* s7 _" R6 D - <input v-focus>( o5 |5 F! {" O. O4 J
- </div>
1 F$ h: b* h. {0 q# T) _& |# [2 G - 0 d" O: m2 u% K" t
- <script>
9 O7 l0 p4 N1 z% b' E# [$ T2 e - // 创建根实例" n$ P# Y5 ~! x, h4 P: C0 F
- new Vue({( m9 @* a4 u" K
- el: '#app',' }, j- ]4 Z# H7 h! j% W
- directives: {" |. Z- d. I# }: e
- // 注册一个局部的自定义指令 v-focus
. S( T3 @* m5 ?. h$ ~, f* y$ u - focus: {# {7 B: y8 h/ m# G# `
- // 指令的定义! r. }7 x; [0 W' k# V
- inserted: function (el) {
+ C* _% I- e; B% j8 j/ v1 s6 \0 j - // 聚焦元素% Q T$ Y( p$ A
- el.focus()
$ p3 l$ N) i6 w4 Z - }
, W. k; T F) E0 P, ?: L% ~" S - }& Z- G* G. n* L% c: r& x" [/ A9 v
- }) W& P! S8 G8 m4 o3 ^7 S
- })( G, T7 e1 I0 H/ q: s9 z
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
* j" K% r3 \* E5 e6 F7 A% x 钩子函数参数钩子函数的参数有: - 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 }。
% E% Y2 G2 M; J$ |: L4 K
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。- K; \2 e5 z2 f1 S" f/ t& t- }! R
以下实例演示了这些参数的使用: 实例8 A& h) u# f$ f" A! I3 u
6 A( j7 d( |; _, ]- [; k
- <div id="app" v-runoob:hello.a.b="message">) O! b/ @! s( U3 C* E6 T8 a
- </div>
" x5 j5 X7 |! \+ {; F -
6 t* r9 o/ u0 o8 g" V - <script>- T/ h- ^! F, T" `& B
- Vue.directive('runoob', {. | I# w8 M) j9 d4 ~. v; J
- bind: function (el, binding, vnode) {, z" _3 v4 t3 s! k# K( H
- var s = JSON.stringify! d2 J8 j" _( n
- el.innerHTML =: [3 ~+ i0 ?5 t3 y9 C
- 'name: ' + s(binding.name) + '<br>' +
# D( }# }% f7 w6 }1 A$ G6 D" a6 ]( Y - 'value: ' + s(binding.value) + '<br>' +/ @* _# C, o# b, a! t
- 'expression: ' + s(binding.expression) + '<br>' +. [) L# g' X3 z) ~0 Z$ }$ ^8 q) D4 W: x
- 'argument: ' + s(binding.arg) + '<br>' +
" n5 C- Q3 G* h6 ?# M7 r7 o; B - 'modifiers: ' + s(binding.modifiers) + '<br>' +
( P9 K7 u; S) _% ~5 f2 C - 'vnode keys: ' + Object.keys(vnode).join(', ')3 B- ]& O, E$ V+ s# K; s5 ]! T
- }
% O: O- N4 i6 h4 Z5 t' f0 C - })$ I- m- u/ z3 p) y$ y; b; f
- new Vue({
a2 x( z5 Q' w; F1 {! z& h - el: '#app',
+ e7 x; B5 z; N; ~! {2 Q1 f - data: {' A0 z# G$ `- Z7 z9 h9 Z$ m: F
- message: '菜鸟教程!', R4 f0 d! q4 ]/ ]1 t7 ?. Q2 f+ K
- }
1 Z8 s; L S1 ^ - })
- ]1 S$ K+ w6 i, y7 }% ]" h* G - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:/ E9 i' z6 z" Y
- Vue.directive('runoob', function (el, binding) {$ B$ ^- T3 D2 s7 p
- // 设置指令的背景颜色
6 K9 _3 |* c% {' G8 @ - el.style.backgroundColor = binding.value.color& D* x8 k* n' d; N* a
- })
复制代码
; N- d2 n1 p* L+ \# ^9 T7 z
4 G/ ~3 h7 \0 n& d指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例1 J2 c& T5 C" f) M* N; ]8 G) L
4 p0 R( H% \2 O4 p- <div id="app">0 N6 a/ g- U7 d9 L
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>" K x$ s1 c7 m2 T8 P- N8 p
- </div>
3 e& \1 {+ e. m; h! g4 E$ C- j - ( G& z" \/ T$ D5 ~) e% Z
- <script># M0 K$ ^4 K# j3 g+ h- ]' \
- Vue.directive('runoob', function (el, binding) {
! R: Q" {4 {2 z& d; b) O5 k! }2 X - // 简写方式设置文本及背景颜色' h. a( R; M# i3 z1 X
- el.innerHTML = binding.value.text
/ _( J4 J( a4 C W7 L0 g- I" @ - el.style.backgroundColor = binding.value.color
- {6 T/ `2 \4 X - })
^$ i" }5 o1 @' \% L0 Z5 A/ } - new Vue({8 g: ?! {; Y- z+ R1 {- O
- el: '#app'
, ^8 D9 d" t' D - })9 F2 [& d1 Q/ b' [2 m1 y" ]% a% W* ]
- </script>
复制代码 4 ?: r4 h0 Y( a' o2 R
/ o: q$ F: X( X: C! q, P9 t
, c$ D% ]* m4 d1 v5 d% x, o3 m3 p
|