+ d8 F% l; E, c1 z' [
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例% R, U; H% j, S
; }% H. [2 T2 z* _, j
- <div id="app">
3 u; D" e+ u$ r: G6 _8 _; Q - <p>页面载入时,input 元素自动获取焦点:</p>+ `/ R) \3 c1 K$ e4 |9 i
- <input v-focus>& c. R# z" L3 R5 \7 p! O2 f9 m
- </div>
. {: F2 Q2 z3 X) h' Q - 3 e2 k/ R$ h* B
- <script>8 V( j& K% k# r& l1 ?; K8 e
- // 注册一个全局自定义指令 v-focus! t* p& } n! Z
- Vue.directive('focus', {
& q& I/ O3 e7 b/ b! E# X4 N0 R - // 当绑定元素插入到 DOM 中。, I$ K* F }3 J9 }# h- a
- inserted: function (el) {3 k$ u! p* L2 w# f3 c- M
- // 聚焦元素' u: O! e A3 V
- el.focus()) I! x* z' S. J9 ~ S# M6 Y
- }
0 `5 y0 }6 ~4 B% D4 ?( I$ D% n - })
7 o) G1 g: X8 p8 l9 m - // 创建根实例2 N) @/ l$ @& M7 h9 f3 b
- new Vue({/ {1 a* }; `. ]" |1 ~) |* P; p) j
- el: '#app'
3 I8 K9 Z f- y- H9 j% y - }). L$ L5 _3 ^$ k' [9 w
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
+ a$ B* Y9 o2 G9 T$ ^" a8 X/ G% z V w2 v" C$ }6 M1 F
- <div id="app">8 G( W, U1 O+ R
- <p>页面载入时,input 元素自动获取焦点:</p>
. ]) U4 ?1 Z" A - <input v-focus>9 W) Y- U6 Z4 \+ z+ v# s
- </div>
6 V! c# J8 ~6 T -
7 ~6 n& H9 C9 j( V - <script>
! q& H; t6 @* }# N4 r7 J - // 创建根实例
1 X( ~4 G1 R+ F. K {' X- o9 e - new Vue({
! a( R; ]8 h p |8 j8 i( L - el: '#app',
' b9 c( a4 C6 q. x% ?* b - directives: {
- p1 q Y$ Q6 T/ `1 x# b4 q - // 注册一个局部的自定义指令 v-focus! l( J# W& H/ ] T7 G+ T' y$ c: P
- focus: {6 t: M( `1 f0 F* T: P
- // 指令的定义
5 f- X: z: {* G( u. H n. y% v2 u - inserted: function (el) {, p* _/ J6 M( o4 z4 A
- // 聚焦元素
* ]; s! z4 [4 E* r - el.focus()
& f9 l9 K( A- n& z - }3 j% d8 d; P: N5 h; A1 t
- }, [& r: e# a, Q" v3 @* `
- }
, b0 ~0 l' }2 e) ]. u% F4 P - })
5 S$ U8 Q6 Q% }: d - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 1 {( m* w3 u' ], w/ @
钩子函数参数钩子函数的参数有: - 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 }。$ Z' ?) Y& F9 }# `% n4 q& ]
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。+ Q1 |& F6 L. Q) D3 k5 ~! {: R
以下实例演示了这些参数的使用: 实例+ ^. F; X. e; d' m) W
" K+ a2 J5 F; ]2 u% r0 K# [
- <div id="app" v-runoob:hello.a.b="message">
4 k0 C2 k1 B! P7 `/ z - </div>
5 A/ S8 O5 z9 {$ t+ b, m% E* \ -
% m _7 @) Q) i6 }* z1 T - <script> e+ d" b- L6 ?6 s) D y* @6 n
- Vue.directive('runoob', {
$ |! Q& J. q" |6 \; x$ E - bind: function (el, binding, vnode) { l, I9 \. @, B4 N
- var s = JSON.stringify
) }% B6 D# j$ B% m* Z - el.innerHTML =
, s( j0 Q4 C# p/ s: T4 C8 @ - 'name: ' + s(binding.name) + '<br>' +! s# I; }# J- L- v) E, x" K
- 'value: ' + s(binding.value) + '<br>' +6 B7 S" l% |. A
- 'expression: ' + s(binding.expression) + '<br>' +
, b2 U v. M& O( z$ K1 N1 f' f - 'argument: ' + s(binding.arg) + '<br>' +0 D1 f) `( p+ s. }
- 'modifiers: ' + s(binding.modifiers) + '<br>' +3 U1 N6 {4 q' w6 c* b8 H+ J7 j
- 'vnode keys: ' + Object.keys(vnode).join(', ')
/ b- p0 C- ?6 B: \$ T - }
w/ b+ ?1 f) ?/ K - })
- }. \6 V& D% t. L i; d - new Vue({/ N) O8 c( X6 @4 i/ Z! a
- el: '#app',
5 N$ x! P, X% q1 [& s' ~6 b$ E - data: {
) v+ e2 N9 ^+ x- F2 G - message: '菜鸟教程!'4 H6 V6 x" H7 k' j1 a. U. e8 q1 m
- }3 S$ }* J/ l R4 y/ C
- })
5 K3 V5 k" V/ f* K) r - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
% J# A* n9 ?( T* r" {/ ^- Vue.directive('runoob', function (el, binding) {
: o- [/ W( f j; a2 y) G& W+ \) w - // 设置指令的背景颜色0 ?0 t8 M# ?- u- E
- el.style.backgroundColor = binding.value.color
! L4 [; {5 }$ k, A - })
复制代码 0 K+ x7 w+ I: }' I! q
( m1 |' E* G, e& N, ]* S8 }
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
# @% n/ G" Q9 K2 f( a1 N6 t
* C+ M/ h) f1 J, m) o: O- <div id="app">- r/ `8 u# L0 ?; r% i5 R7 P
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>) u2 c* i% ^0 B
- </div>
. H8 q! ?$ C3 m. N -
" q2 Q4 i' S5 p: e9 s% @( M - <script>
8 M: k1 e( o2 [$ E - Vue.directive('runoob', function (el, binding) {1 G B( X* }! h6 z
- // 简写方式设置文本及背景颜色9 b6 R I4 ?: ]/ r/ y( J
- el.innerHTML = binding.value.text
: M# Y$ i4 `+ @" E9 @ - el.style.backgroundColor = binding.value.color
5 V9 C1 S( g( T5 T' {) g - })
9 b4 c8 J; u6 ]0 H" _& j - new Vue({
. X @7 I. |2 M+ \ - el: '#app'- H2 b6 C# j$ t1 I2 M$ m6 Q- a
- })
) Z, K ^% o. C- b% r/ O: t - </script>
复制代码 * U5 I* p5 G$ v! X8 m" w
" I+ y6 g$ q. S& `
: l/ f- v: p: R" r9 @* s |