5 h- H7 i0 R0 [4 ~除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例5 T4 s: g% e2 Y+ v1 c, ]' h5 b
& _# u3 a0 G1 ~/ Y) a% w# P9 | q" N
- <div id="app">5 Q- w) {( `/ C' b8 z, Y: @
- <p>页面载入时,input 元素自动获取焦点:</p>2 l3 A5 {7 ]: u! c K, s/ L6 W* X
- <input v-focus>
: t5 ]$ h$ n6 S- w" b - </div>
0 _; b" V" ]6 ]1 n: M0 Q - 8 v' B$ ]! ~3 |' S- Y1 ?
- <script>
5 c" t0 c! R3 t; M3 `: X5 r - // 注册一个全局自定义指令 v-focus
. N$ ]* Q+ ?! `: D: x0 O" ] - Vue.directive('focus', {; h& J' D) Z |, }7 a
- // 当绑定元素插入到 DOM 中。
/ N! j: S. X/ _# F: Z& p+ p. h, G - inserted: function (el) {
/ I/ j9 P0 ~. u$ R6 K3 ~$ h - // 聚焦元素5 Y- M g6 o! v5 R. d: A
- el.focus()
! @( H: J- g. o: r4 N" I1 n' H5 E' W - }; ^0 I# G* F) }4 l ~5 M8 q
- })) ^9 t! ~0 @( r) L& T) d9 {# _! ]
- // 创建根实例
1 Z. O' {) x c, C* ]% b. j( J - new Vue({
" q7 N# n+ a7 y I. e' z - el: '#app'
|# A4 ?- y" ?* w' w - })
: v0 }: f- d; q1 A& A. \/ p - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例 ?2 f, R/ G/ x6 d$ @
4 V, i( x! I- V! Q& \& F
- <div id="app">
! z8 ?% ] L* x$ J$ Y8 v: k9 x$ }& \3 Q - <p>页面载入时,input 元素自动获取焦点:</p>2 ^* M4 [3 V; D
- <input v-focus>' A& x' }& r+ f; ^8 Z1 K
- </div>0 X" D- I! ~' Q9 V
-
, [8 c, {2 \7 G2 |: d4 a; f3 P - <script>7 l- k$ i/ I- }4 d0 K- J: ?
- // 创建根实例) [- w) _ o! {; w
- new Vue({
0 N- Y" {: v7 i. l/ X' Y; F& {9 Z - el: '#app',9 Q. H2 G+ ]) c1 H& V+ F$ s
- directives: {7 Z5 g! D& J# j1 M
- // 注册一个局部的自定义指令 v-focus
' e9 o1 o F z( | - focus: {7 x7 o& j! c* t
- // 指令的定义; T2 J4 G @: r% j/ D @
- inserted: function (el) {
$ L w$ O( d4 W6 p - // 聚焦元素
2 J4 ?6 [ w: v" { - el.focus()) ^) K$ d7 O) ]6 ?
- }
" p- R3 K3 X/ R/ l I5 \: p( D - }
! O! j2 U; U+ `( ]. U6 H d - }* Q$ A# }2 h' `0 y! b
- })5 r6 {; i/ R x0 s0 K4 w
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
9 p9 B2 Z9 H% E4 d {* S3 p9 c% l 钩子函数参数钩子函数的参数有: - 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 }。
0 i9 S+ x% E% A/ B2 _
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
! j% l" _! ^: O/ h; z
以下实例演示了这些参数的使用: 实例4 b; o7 r. ~: d* i& ?6 Q
, \2 L! d. I& x- <div id="app" v-runoob:hello.a.b="message">
_, X7 F) q# E' \ - </div>! s" [& |: q/ I; C0 H, Q2 ?( M. }3 A9 v
- $ ^1 G! T: a& F4 ]
- <script>6 ]' _, l3 t& @9 ?* \' U
- Vue.directive('runoob', {& y E4 l s! s. [1 L
- bind: function (el, binding, vnode) {
3 n; c; I+ C8 B/ P) i M. A - var s = JSON.stringify/ g, w/ B0 V. O5 o( L$ @: m F
- el.innerHTML =
& ^2 {! ^8 r6 I/ N) i5 I - 'name: ' + s(binding.name) + '<br>' +
* ^& r: f j1 R3 I5 q+ F - 'value: ' + s(binding.value) + '<br>' +/ ?( t. G. w/ u: v' E0 Y Y
- 'expression: ' + s(binding.expression) + '<br>' +
2 O' V) Y% N+ w# B2 g - 'argument: ' + s(binding.arg) + '<br>' +
9 f7 k$ K. u& [5 w7 A - 'modifiers: ' + s(binding.modifiers) + '<br>' +
/ ]5 C! g+ K# ^7 u0 e2 x - 'vnode keys: ' + Object.keys(vnode).join(', ')
9 ] [/ [; R) h$ O - }9 m( |1 B m( k- a7 s9 K* b$ B8 B
- })
3 d% B% w; [: E$ p+ x, r - new Vue({0 f1 X5 R6 Q& Y6 q) K
- el: '#app',2 _/ V, P% d- n3 X9 d6 v
- data: {' k; f* E9 e2 N, W/ h% g3 ^
- message: '菜鸟教程!'' e- q& z2 s- o: d
- }6 o; F7 K, `6 I- i- [+ q6 q: p
- })4 E5 u$ `: V4 B/ ]! I6 _
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
) [ v9 `8 ?( \7 a3 M- Vue.directive('runoob', function (el, binding) {
3 Y- I5 n0 `% s - // 设置指令的背景颜色 T* q6 x l2 ?# ]& f' C4 Q5 C
- el.style.backgroundColor = binding.value.color
- U% m. w$ L b4 p0 Y9 Y+ x' B - })
复制代码 ' T3 n! h+ ~' b1 }
; j/ ?5 S. G( n1 ?
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例4 G/ C* N1 A3 L6 l6 c5 A6 d+ H# h
- V6 R' p6 \" Z+ B+ z- <div id="app"> C! i6 }0 V& r& s
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
; a2 E9 n% e+ O9 x0 U6 d( E - </div>
- ^7 H3 j# y9 H -
+ O' x$ z: |3 P# c l - <script>8 F; T$ N' P/ b. k, q+ g! t
- Vue.directive('runoob', function (el, binding) {2 `* p9 c; Z5 @' q5 N
- // 简写方式设置文本及背景颜色
% q, E1 t4 B* f- e - el.innerHTML = binding.value.text1 z6 K. j1 N& ]% l! _
- el.style.backgroundColor = binding.value.color
1 q9 o7 s9 r4 A+ f - })
" p8 D8 l) {8 T m6 M - new Vue({- B Y5 N. ^+ R5 n
- el: '#app'
, `- z% }; U, n; m* G' r8 N - })
, X7 I7 i! \. `" `1 S5 ` - </script>
复制代码 # Y# S8 L+ W: r: |5 D
# T! R+ @; x+ O0 j f9 g5 Z
" B2 x9 ~1 c' P+ m; A
|