4 x0 d) F& v# Q2 ^2 o
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
7 U9 ^, C% }# [, D+ M' q, q4 p4 j
6 D0 {4 ]( i% N/ I; Z, ]: I- <div id="app">
c* M* K/ j! q6 N Z3 D' _ - <p>页面载入时,input 元素自动获取焦点:</p>) v* G/ w; J# Q) I7 }0 }( j
- <input v-focus>
* ~. f) m, f. m# z. t$ @ - </div>
) q* B2 j- p1 R0 [3 A; V% @: X+ T - 0 y% T+ i% |- n. r) \- X* @
- <script>* o1 Z1 i- v, r6 Y8 T" ~
- // 注册一个全局自定义指令 v-focus8 [; Q" ?* S" Z+ I5 C7 @; u& [9 q
- Vue.directive('focus', {
" _) h r5 V& U4 G7 s - // 当绑定元素插入到 DOM 中。
* {7 ?- Y- i; l/ Y/ Y; p - inserted: function (el) {
* B. N0 _# N' p/ Q8 v; ~ - // 聚焦元素% D$ x+ z7 W+ J6 m
- el.focus()
. P4 t, s0 S8 H/ \6 q& q - }
8 B3 Q2 t( w- S8 S& A - }); n+ ?3 p+ q; o9 }& O
- // 创建根实例6 O9 s) b1 Y2 C, [
- new Vue({
, W$ @# y* w4 T# Y+ } - el: '#app': p6 y/ R0 G9 {/ `2 D; p
- })
/ I( @9 P2 z. { - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例, h1 S( v! r/ M8 {& U/ b
+ ?" p5 `0 {1 j4 C' G9 A8 k7 ^- <div id="app">
9 v0 n7 ?5 _6 i - <p>页面载入时,input 元素自动获取焦点:</p>. l6 C. W4 X( x, o# \1 e% ?: }
- <input v-focus>3 ?, t6 l9 e7 T/ g4 t
- </div>' j; p+ G( T) \) O
-
$ J( e8 Z1 T, l( H1 [5 M - <script>& R! h3 E: G1 k+ m5 K' G5 f- W
- // 创建根实例7 g2 [5 C8 A) w
- new Vue({& h" b4 u: Y- w8 ?# U4 x
- el: '#app',
" I; Z5 @. N, c6 D' f8 X3 D: x - directives: {! \/ S* N! _/ b+ F5 `0 u
- // 注册一个局部的自定义指令 v-focus" t+ [! n8 p4 }5 E+ R& r2 d
- focus: {
" J i8 E7 }0 v1 [9 j5 R* x# v - // 指令的定义
# ?! T# K1 U; V! ^9 h - inserted: function (el) {3 @6 s6 `. O% S: _7 T1 W5 k
- // 聚焦元素
6 k' l0 ~) p8 Y* Y - el.focus()' O# j* q6 n* j) P \; x! s, G9 F
- }
8 s, R, K* [$ A3 t- L - }
$ n' x- k% |1 |3 R% h; B3 y - }
$ Y2 ?: e3 _- C y' L7 A5 m - })% e$ Y$ ]! X: w% l/ W1 Z
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
. q [' d. r5 e% K2 k 钩子函数参数钩子函数的参数有: - 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 }。
2 Z2 h( D" \% t( }, v
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。4 B6 Q+ n+ O/ J3 d3 d ^
以下实例演示了这些参数的使用: 实例
, X7 U( N, Q$ B5 b R, ?
' B( k6 D8 ~9 j3 L- <div id="app" v-runoob:hello.a.b="message">
- k) r1 Z6 j l8 u4 M# U - </div>4 s# d: S/ i% o4 q
-
3 \: J6 k! \& D+ h' w1 w: a7 S - <script>- ~' C: [' ^# g
- Vue.directive('runoob', {
, S; x! \4 p6 t! ~7 H2 Q/ ~5 Y - bind: function (el, binding, vnode) {/ x$ o' ^! u- I. w
- var s = JSON.stringify7 t* [* M( Y" p* ~2 o w# n
- el.innerHTML =
# Z& f W# V# Z$ B - 'name: ' + s(binding.name) + '<br>' +
# m" T1 T! X9 g7 j8 P2 N) g - 'value: ' + s(binding.value) + '<br>' +( @4 T: j" r n2 w+ o
- 'expression: ' + s(binding.expression) + '<br>' +
; E# V0 Z/ o5 }. P& L! M. V - 'argument: ' + s(binding.arg) + '<br>' +7 ^ v( y' _/ v: X
- 'modifiers: ' + s(binding.modifiers) + '<br>' +0 d7 e9 ]* v8 x, p, n9 D3 I
- 'vnode keys: ' + Object.keys(vnode).join(', '); `3 [2 Z' i1 W# e6 m& _( h) Z4 v
- }
7 [! _5 q5 P8 q9 Q; k8 n: e - })
8 T* s; i3 |( ]9 F$ g( b - new Vue({' E' |3 t& B$ v: ^4 P& Z
- el: '#app',* A& Y& F. _0 O5 [5 R& c# x9 B
- data: {
0 U, `) z* `- }3 t3 c - message: '菜鸟教程!'* b/ v+ U* U! e9 _8 I
- }
9 ~, _' y) B9 `8 p: Z, u0 o - })% k$ f( n$ \1 ~8 P
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
% j: L6 }& i6 [7 y+ D7 F! T, K- Vue.directive('runoob', function (el, binding) {& M* M/ e! y4 w
- // 设置指令的背景颜色" F4 k b2 \# t* }( H4 O9 d1 z1 a
- el.style.backgroundColor = binding.value.color( F6 Q, B1 @, {! E0 ?- f' i, c X& e/ q
- })
复制代码 + e: |/ Y; @) z& r
" x% n$ `7 U/ k3 ^
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例& g9 Z7 z% f% U$ |8 v t
' d. D' p. u5 y+ }9 z
- <div id="app">
1 R2 _& d* r+ K: | - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
) z. n% d1 j: x1 F - </div>! a5 Q( e& M' ] W0 j" V
- # s a! P8 ], T0 I1 ?( n) J% L
- <script>
3 q( ?7 ?7 b4 f+ V - Vue.directive('runoob', function (el, binding) {) }7 V3 R7 k2 ?% x
- // 简写方式设置文本及背景颜色$ R6 x3 o0 U+ l- g# t# R2 \: Z
- el.innerHTML = binding.value.text
0 j Z% P0 o1 C1 ?8 i0 {- @ - el.style.backgroundColor = binding.value.color) ]9 l4 A* ~* a
- })+ o2 `1 F( z4 K0 O8 z# r; K3 L9 I& V
- new Vue({
4 \' g. A4 ^! L2 c/ j! w - el: '#app'
* h- T* z- w7 M; T' [4 v' s9 h - })
. r# @! U B" e* ^: `3 F - </script>
复制代码
9 B6 D( X0 i! Y( B% z. Y1 V& q+ V* h1 d5 E
/ d/ t1 S9 R9 e) j5 R* y
|