+ f* W7 Z) f1 K5 i* l除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例2 b Z, j$ T& n) c5 k# h
+ I/ l8 J/ E7 F2 s. l; z& P- <div id="app">/ P& [& n. K/ t! o( a/ c
- <p>页面载入时,input 元素自动获取焦点:</p>$ A, P4 h# G& G% [7 P7 t$ u
- <input v-focus>% G0 G8 y% t. m9 Q! ]/ a
- </div>* M" r& v* F4 N2 S$ S0 l
-
+ h" i. J$ e) n, ]. M; o$ d - <script>5 Z! N+ @+ g! n& h/ {+ h
- // 注册一个全局自定义指令 v-focus/ ]1 t$ D% C. k! Y4 B
- Vue.directive('focus', {
9 N. d+ l: r' u3 l* q - // 当绑定元素插入到 DOM 中。) S6 [( T" f& G1 y
- inserted: function (el) {
) Y ], I4 }" G: Q4 r3 R l' I - // 聚焦元素5 c! b" {& h: S5 F8 }
- el.focus()
' M7 N3 E* S: x! j/ d - }- q5 R8 ?$ n0 G- p
- })" ~7 V, w4 f5 J
- // 创建根实例
( a# S X6 E1 Z- B4 V3 V: z - new Vue({( j9 C3 G: |) v; {
- el: '#app'" _0 P. p. d z% j
- })
0 \3 j2 ]+ _ a0 d1 T: ~' _/ I - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
, U) T! U" j# |. h: v' e6 n6 Y# U/ q) U. }. H$ F6 V9 f% y
- <div id="app">: ~! H: R1 j+ Q) u# x4 D
- <p>页面载入时,input 元素自动获取焦点:</p>7 P! n% D% ~; [! |4 v
- <input v-focus>4 W, X7 U+ T ]
- </div>- ]5 v3 E5 s1 L2 n2 B+ L+ w
-
+ L6 I% w- h: X; K+ N- u- Q# M - <script>
) Q) g! m( y2 ?$ b2 ^- u - // 创建根实例+ [8 V: ^5 E. Z% a4 F
- new Vue({
5 D( W1 d d+ c) w+ O - el: '#app',3 G6 _/ @2 \, Y4 _
- directives: {1 a& n+ v8 ^1 l
- // 注册一个局部的自定义指令 v-focus
1 i/ f; T8 ]( u% u( x; ^% q) G - focus: {
; E& g- y1 o$ ?1 D3 a& K" |1 e+ Q8 X - // 指令的定义9 B8 Y( \, \9 M8 u2 ?
- inserted: function (el) {# \9 N( d! {) ]
- // 聚焦元素/ G, n' X L9 d
- el.focus()
6 M1 A7 [0 e" M3 h! t2 b# @ - }, G6 g' P4 i* e- V3 ]- t
- }
) z4 E8 r' o" S6 O' [, m - }
6 ^# c- J( {* K - })
- K) K% Y3 q, |1 c/ ^% H9 _* r: p2 q - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 $ e2 v+ m, ~3 H$ J9 _' @/ d8 `
钩子函数参数钩子函数的参数有: - 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 }。- n0 v' { C* T7 k+ A& U( \; s
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。; {6 C' H6 y6 a
以下实例演示了这些参数的使用: 实例6 [# f7 W$ U5 h# X9 i7 i& [
3 u) @! q9 O6 g- <div id="app" v-runoob:hello.a.b="message">
6 R5 R( n0 m, R% o* g - </div>& x- j, {! G, _* B) z
-
* O5 z/ C" f7 W& [3 Z7 H# J/ i - <script>
* N/ [+ x- s0 l& F! z - Vue.directive('runoob', {
% ~# ~5 N1 h: j' Q% e - bind: function (el, binding, vnode) {" e! N3 l* A5 @' p* }
- var s = JSON.stringify
2 _7 {! ?5 [) U7 }9 C" m6 D$ p - el.innerHTML =
3 w8 b5 p* ?3 v" E% w& j" @ - 'name: ' + s(binding.name) + '<br>' +. O K! X8 o+ P4 c" p; D5 }( T
- 'value: ' + s(binding.value) + '<br>' +* T# e# d5 P' G$ [$ \0 M
- 'expression: ' + s(binding.expression) + '<br>' +
4 z4 O5 x9 D; P5 R - 'argument: ' + s(binding.arg) + '<br>' +/ I. @& C( a, `# X8 u
- 'modifiers: ' + s(binding.modifiers) + '<br>' + j1 T: m1 H5 `: r+ @- l! s) ^& M6 i
- 'vnode keys: ' + Object.keys(vnode).join(', ')
c! P5 \& |2 A' ^8 K) }' O7 w/ _6 o - }& E8 y# m5 [4 `
- })4 O- T" V9 T" C4 i1 }- @
- new Vue({- ^) S+ o8 X( ]5 @ P. H( r2 }" q
- el: '#app',
8 w2 V4 ~( ?0 ^: b* c1 H8 ? b( g$ ?0 k - data: {2 d q0 S ~7 f' J5 K
- message: '菜鸟教程!'6 O" L) l0 T3 ?$ }. v+ m
- }
, N, Q, L4 H0 u, ^. d - })
2 E2 {9 S! g; j+ z$ z7 I8 y - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:, i( P. v0 w7 C: ~' W+ n6 @
- Vue.directive('runoob', function (el, binding) {
) \% v5 V. F4 }2 N* a7 ~ - // 设置指令的背景颜色- w# a9 |) H8 f1 B, Z( C
- el.style.backgroundColor = binding.value.color" Y4 U* E8 o8 K% p `
- })
复制代码
3 y4 F' J% E1 N0 S9 [& {5 M y. F0 \: s/ I. g$ g$ d( j1 H
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例* {3 {2 k1 Y) c* R# m
6 ^1 q( r+ b- x/ D a5 x; O
- <div id="app">6 l5 l5 T e% V' N9 ^2 o
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
" ?( f0 `$ o; Z; n7 C" S - </div>2 k. p# u2 b6 G
- * R' |+ ^" A* v$ w* |
- <script>+ s1 d" t# P2 F" J5 w
- Vue.directive('runoob', function (el, binding) {3 e& O% e' N& W Y3 J3 D" u: [7 y
- // 简写方式设置文本及背景颜色& b f( @; _5 i7 e* a- H
- el.innerHTML = binding.value.text
& `: r% @7 L6 E. {5 M$ w( y9 A - el.style.backgroundColor = binding.value.color$ S8 f! l: f) l J
- })
& y7 ?& a- A- G, r# W0 k( c p; T - new Vue({
0 j+ o3 h" I+ s: V- T1 v2 g - el: '#app'
% D$ r7 A! u* w2 H L [ - })
/ q+ r9 U% P! t: [: W* q; q* X+ H - </script>
复制代码 - o# p+ b* S, _5 _' S0 L
`" c7 m( f3 W
0 |$ e; o+ z# O" X |