C8 J. c2 c8 `, O" r Y除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例2 Q1 u: ~* z& L5 ]: @5 D( k
) D& T6 S% V6 L7 c. S- <div id="app">! M3 Z2 O3 q. z. y0 G: l
- <p>页面载入时,input 元素自动获取焦点:</p>6 ?4 n! S, w' Y; S; b4 Q- a: S6 W
- <input v-focus>4 D( `3 F1 I) s4 R
- </div>
- Y; {, G4 m |! f% z2 l0 d - ( U: I" D( M7 t0 [
- <script>1 l, p) j1 }+ |: V, W
- // 注册一个全局自定义指令 v-focus
& p; ]. }3 v8 U+ e+ c9 \ - Vue.directive('focus', {
' g8 @* l2 y& p: d3 Y* \# [. H - // 当绑定元素插入到 DOM 中。) _1 \% G N' ]$ m( N) c2 E
- inserted: function (el) {
7 E6 { j, s3 ^, k' S; w - // 聚焦元素 H1 w# B. J, E1 U
- el.focus()2 `$ f0 A2 u8 D7 c& N
- }- q3 O' r3 x$ B
- })
& Y* _+ t L# I- R. T2 Z - // 创建根实例
! i1 V) O q+ |) X - new Vue({
, ?+ i4 O* L" }8 P, p! R - el: '#app'
( e0 _, L3 i% c1 M5 d7 Z - })4 O7 o2 q0 a1 e9 {0 h& G5 W' u; ~
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
0 q! w# i( M: V- K4 Q) ]; g& l8 `3 G& c% R- n' x; u( D
- <div id="app">
j7 o) s+ W& f - <p>页面载入时,input 元素自动获取焦点:</p>
$ n5 F( a0 D7 h) W - <input v-focus>9 ?% D1 o6 e8 B; o
- </div>
, Z! n1 v+ W9 b `* Q - $ u9 q/ ?5 V9 v6 m, G% u/ F. ^
- <script>
# O% ^7 y( ]* I$ k% O - // 创建根实例. X- u1 j' f W
- new Vue({
4 b1 C1 u' j( i9 }. Q+ h5 V# N2 l4 Q - el: '#app',& h7 G* f. u3 d" o/ \2 H
- directives: {
3 v+ a' t9 l |) R! E - // 注册一个局部的自定义指令 v-focus. n: T! W: k6 o: V; c1 P
- focus: {- U. i& C. A7 a% Z2 }0 {8 Y, W6 E) |
- // 指令的定义) u3 f% e; x( s& l% a3 o% s1 e( a5 l
- inserted: function (el) {5 j4 U3 n3 O& R/ S3 k
- // 聚焦元素# c; Z& B3 U# K6 _; R# R
- el.focus()/ f- z5 R+ g2 q/ H$ s
- } `9 W v' \. B
- }/ o. u1 ^% X6 `! o$ ~
- }+ `! \! u4 |6 q0 Q |7 i- W1 ]; B
- })1 I6 a( k0 j8 s+ Z
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 / ?% F+ E$ Z: ^" Q
钩子函数参数钩子函数的参数有: - 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 }。
( b& E6 a( L. T/ f5 d
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。3 ~ Y. k1 {& }* h' d
以下实例演示了这些参数的使用: 实例
% ^# }- G* G% n; F* t! P4 s+ g. R; S; j4 ?, h" }& @
- <div id="app" v-runoob:hello.a.b="message">- l- A9 a$ d) E& Z
- </div>7 f& b& M7 I- s: Q( N$ A
- ; R7 f% ?: G+ @5 d
- <script>' c1 j7 K, i& }2 u/ N: `
- Vue.directive('runoob', {
) l& E. T8 Q; X# O) o6 @. | - bind: function (el, binding, vnode) {7 X+ X& Y0 Y9 M3 q$ C5 d
- var s = JSON.stringify
; }8 |2 K) c f& D' p) I. D5 ?$ _ - el.innerHTML =
( {$ p9 S5 F, p* t5 G. l$ m& n - 'name: ' + s(binding.name) + '<br>' +
$ R* ~0 D" [. x - 'value: ' + s(binding.value) + '<br>' +
. q; P0 }. g2 {1 `' Y- [ - 'expression: ' + s(binding.expression) + '<br>' +
' E E( W* L# {; \$ v - 'argument: ' + s(binding.arg) + '<br>' +
0 T1 Q$ O( \0 c2 }$ g% h - 'modifiers: ' + s(binding.modifiers) + '<br>' +
$ T% R5 ?2 r% a3 s/ O0 O# | - 'vnode keys: ' + Object.keys(vnode).join(', ')
. Z2 K4 E5 C$ r2 J - }
9 t' V0 n0 T; q$ l1 X - })
1 X$ B" H: [8 J5 N! Q/ D# M" N - new Vue({/ G& m7 G9 u. J1 P5 t* `( v
- el: '#app',
0 G# b) K! P1 r( \, j1 F* J - data: {7 U9 T9 O$ k3 [
- message: '菜鸟教程!'
! }. I- | F2 e4 }: {1 Y I - }1 w" J' W7 T4 ~" _& N. s+ c
- })2 n" {/ A& f0 u# _- j
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
8 C' Y, i$ P2 E: N) n9 ^3 {* [. l- Vue.directive('runoob', function (el, binding) {! V s' M/ E0 s$ [2 W0 W
- // 设置指令的背景颜色
, S3 S! j6 \/ T( F& X; z% w - el.style.backgroundColor = binding.value.color
% J- e F1 r6 Y- o: f9 i! B- m0 A& n - })
复制代码 * I5 k: g" v0 {+ B5 u
% [( x1 r" z- n* v5 H/ @/ ?. O0 l指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
! ~4 u- u `3 P# \
- o* o0 C+ r" N" k2 L7 b- <div id="app">, M- x7 Y6 _' ^/ U- j o& X/ J
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>- {2 s& P; V) Y7 Q; d ^7 i1 ^) s
- </div>
) M/ c9 s! R% l B. Z; Y -
4 P5 g6 G! i# ?! r1 x" p9 M - <script>- X* Y: j2 r/ B8 V, R1 m; k
- Vue.directive('runoob', function (el, binding) {0 x6 ~7 l7 ]& f9 Q
- // 简写方式设置文本及背景颜色# ^3 V& m. _+ V6 J
- el.innerHTML = binding.value.text
5 P- v7 y, j5 Q% m - el.style.backgroundColor = binding.value.color
( B2 W: k2 K8 {. }, F1 t, t - })
: T/ x4 F6 n; Z- b( L2 u - new Vue({
, X) }$ R8 T" Z d$ e6 Z - el: '#app'
9 t% v8 y& q. a' n - })- V3 b6 O& i7 F$ d
- </script>
复制代码 7 g$ j* [/ }5 W8 N1 ?
# A$ O4 v' U4 \; V+ H" E7 A7 w0 q! ~ _$ X E: i
|