- d" t% J9 G( S7 i# q4 a! ~/ v
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
4 j4 `! L1 x F$ r' h5 I( O
4 s; n4 l& O; z5 `; \# |" m, w- <div id="app">8 a3 I+ j: \$ E
- <p>页面载入时,input 元素自动获取焦点:</p>: A4 n$ f4 K2 {# P" n% `
- <input v-focus>
$ y/ Y9 ~- C& J& T6 y& F' R! F4 L - </div>$ j- t! R! S) C0 V5 v/ R6 Y3 J
- ! Q' _8 c, f1 N+ h' [
- <script>2 J3 z7 @( `& a# l/ R% m
- // 注册一个全局自定义指令 v-focus0 X, \4 ?( h- ~$ C5 Z1 Y, k' G9 A0 o
- Vue.directive('focus', {
/ ]" M9 c9 `, q; q1 L0 u' j - // 当绑定元素插入到 DOM 中。
$ d, _, }$ y- B/ Q3 ~* E& w7 _4 @ - inserted: function (el) {
. h" Q" W0 p: s7 I - // 聚焦元素
% b9 w8 g+ q+ x( ]7 G) g - el.focus()8 u% A6 V4 L4 A+ _, Z4 D/ t
- }
/ s% _& o: L w& j6 l8 G* Q - })5 X# n D# s- j7 g9 N$ ^! b
- // 创建根实例1 X2 \( J1 q- w3 ?
- new Vue({4 N4 e7 C* P7 x: c
- el: '#app'
% W6 R: o; G$ k4 A$ ~ - })
1 u/ S0 l. V. H+ b8 n4 r - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例5 S5 I9 @# A/ t8 W0 k0 U U
# z6 ]5 h+ d8 Y* ]+ e( D# u7 F1 U- <div id="app">! M9 w |; J1 X0 A3 e, h
- <p>页面载入时,input 元素自动获取焦点:</p>& ?! K% s$ [6 m+ x6 J o. @
- <input v-focus>
, a# h" @# v5 }( x" X j7 N7 a - </div>
3 ] f4 S3 z6 l, q0 w% c -
t+ d& M, ]4 o6 N+ f+ E# F3 j$ b - <script>
+ k8 V6 v3 B0 k/ n1 e+ E - // 创建根实例' V0 Z6 D8 V4 r2 T
- new Vue({
' s4 F+ F/ Q( `8 f( _8 U - el: '#app',
# ]$ ~+ z. q- Q$ ?8 e7 ], n+ Q d - directives: {- C6 q9 q9 C+ |2 r4 l. Z% u( p0 y: w
- // 注册一个局部的自定义指令 v-focus" T8 p' G* U6 M2 N1 J
- focus: {
( l' ]; K% O( y9 \: H: h - // 指令的定义 T8 o4 S0 _' |6 k
- inserted: function (el) {
3 K9 d {- G) i3 v0 ` - // 聚焦元素
4 g8 o9 l0 m: R8 f! P5 D0 n - el.focus(): o" L2 e l( x# T) W
- }: O8 Z ]& p1 c4 v
- }/ b( a. G, b" H8 _
- }
3 Y% }$ h) b1 H6 q7 D - })5 T- g) x5 Q# v) R0 J% ^- u
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 . q& F7 ?+ {4 K$ r
钩子函数参数钩子函数的参数有: - 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 }。
- G* m6 T+ D4 ]; r) z/ O
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
% r( \4 J5 m! L: o4 T6 @2 q
以下实例演示了这些参数的使用: 实例
6 r/ l6 D3 s" Y' t$ L/ ]+ O6 \ _% T$ N+ W ^
- <div id="app" v-runoob:hello.a.b="message">0 C2 C7 M, F6 i: y
- </div>
9 r. q# o5 }% {4 Q* R" R - ) T4 g9 k7 Z# [% E$ k4 p* ], i! Y
- <script># z: J& |. O* T! D/ i y
- Vue.directive('runoob', {* _( u+ ?, l0 x2 q5 A6 R/ X/ q5 ]; r
- bind: function (el, binding, vnode) {, m% R, Z0 a0 g0 l+ |
- var s = JSON.stringify; m$ G5 `, u# w/ B0 x9 U+ A4 D$ _
- el.innerHTML =/ G; h- Z7 S0 K9 ^
- 'name: ' + s(binding.name) + '<br>' +
, {* V @; y& r( w z u. w0 y - 'value: ' + s(binding.value) + '<br>' +
+ }# P2 F+ c3 w - 'expression: ' + s(binding.expression) + '<br>' +6 |. k) H" g: T+ X1 v ^
- 'argument: ' + s(binding.arg) + '<br>' +
$ x7 F' V: y6 m4 R7 Y: t3 B0 ^ - 'modifiers: ' + s(binding.modifiers) + '<br>' +; e. P, G& Q O: ?/ e* h
- 'vnode keys: ' + Object.keys(vnode).join(', ')% l4 v& Y* a( ]! x' b- |" J. N$ Q0 t, f& |
- }
* y3 Z: g% M ~2 |) I+ l - })
/ J" P3 V Q6 i& S0 p) f7 ?* @ - new Vue({& t3 w6 w1 i7 C2 w9 y" K
- el: '#app',
0 ^. V6 N0 M) ` - data: {6 h8 Y" s6 X! I/ `; ^
- message: '菜鸟教程!'
5 C c! p U0 q+ Y, d/ Z4 ~+ b0 M - }* @9 [' ~- ~9 F4 r* R
- })
* y8 i6 a* i8 {4 W3 b+ S0 f - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:4 Z/ c8 t; y, v n
- Vue.directive('runoob', function (el, binding) {% ~. }, E1 ~, x' m6 x7 a, n3 {
- // 设置指令的背景颜色
1 S% s U4 ?" X% ^3 U* l! t - el.style.backgroundColor = binding.value.color
( g0 }' R1 ~+ n5 z2 c5 x' u/ r0 L - })
复制代码
/ _' b) J3 }4 B) J
" q, Y# B {) U. Z2 z, d指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例) m; {, J( j9 i3 e% o
6 O0 M5 F4 I) \( W' B6 ~8 s
- <div id="app">1 [0 n, B* c8 T9 P
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>5 n4 u% }3 Y1 k( n5 N9 K" B
- </div>
; z4 S C2 W" M7 {5 x S; X -
7 _7 X9 @! O+ s - <script>( _- ?& I( Q# {# ]
- Vue.directive('runoob', function (el, binding) {% \$ W, X# e, T* D
- // 简写方式设置文本及背景颜色$ Q* z2 R" |; u; V3 A$ S
- el.innerHTML = binding.value.text4 |! Q0 y7 N# O Q' h+ v2 x7 Z
- el.style.backgroundColor = binding.value.color
# g* s9 t: [! S - })/ @/ p! |1 R g4 W
- new Vue({, @ P0 z' ~0 `. Z9 Y4 P0 x# \
- el: '#app'
( b0 U/ u, H- N9 h) A/ l - })$ f7 \1 ~; B' e% }0 G2 J! b" R
- </script>
复制代码
9 _0 V( @) v+ m( F
G4 V7 \" a7 c( z5 O1 H
1 ]7 _3 V$ {; s. E4 V |