* _! L4 O1 |( f# }& K3 G除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
! T) I& u2 ^! W0 r; ?* P E) U) j& \. ?/ O/ `( r
- <div id="app">
" e8 H$ T, d7 w1 B - <p>页面载入时,input 元素自动获取焦点:</p>3 ?, c$ B- P o3 S, {) L3 a
- <input v-focus>' w1 q7 w9 G, t" @# A
- </div>
5 j2 P& q; C; M6 j7 p- W9 B. b -
1 y T4 e& } a - <script>
- k, e/ x$ }, w - // 注册一个全局自定义指令 v-focus
1 B) n1 C6 \7 A# r7 E6 `- b - Vue.directive('focus', {
! F! K/ \$ U. q" r3 y. _ - // 当绑定元素插入到 DOM 中。
: D# R _- x5 @' i$ T/ V9 ]; d - inserted: function (el) {; i# q w9 ~3 a/ {$ H
- // 聚焦元素+ F" L! l% s J* L
- el.focus()# N; F" ?0 Y. k. O5 g
- }
+ m$ w- \( s. _$ I) T* g/ S- ~ - })( E" i# T6 @8 A4 ]$ A5 b6 K
- // 创建根实例8 w9 }; z" N" w* L" H9 \- W7 i! x
- new Vue({. s8 q! [: E6 Y2 k( @8 _3 L6 U9 W
- el: '#app'5 K6 a6 Y, K* V4 |8 V) ^7 l, T
- })
. c7 d6 b) u1 z: X) p: G6 M* z - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
' h) b6 u( X! y% V
' _4 T) w; E v% @- <div id="app">
) p8 e' L% h) a - <p>页面载入时,input 元素自动获取焦点:</p>
# b$ K! S$ }" w/ t/ c5 O - <input v-focus>2 Q! T+ Q" ~- { Y1 x0 W; R( `
- </div>
/ a" m2 i6 ^8 w l- W& a -
: H5 h# g" Y* l* n6 [/ T4 w - <script>8 W' v" I6 l9 \
- // 创建根实例: ~9 j! s2 A; W, X' ]. Z; M
- new Vue({
" _! x( n/ |; v# o' f. _# z- d - el: '#app',
) d! F% J- ]- s2 S - directives: {
: {$ n% h/ S1 }8 a K+ }5 h7 R0 @ - // 注册一个局部的自定义指令 v-focus
+ w1 L8 ^+ H' C" I, x3 \ - focus: {
: O1 L- h/ Y9 a$ e8 V" c - // 指令的定义
+ O& [0 a: J) V1 h3 s- |! y: i - inserted: function (el) {
; Y' v( d1 A: n$ w# ?* l& F - // 聚焦元素 s( C ]8 {" z, x8 s9 j+ Q1 W9 z
- el.focus()6 Y2 K$ F4 j8 d6 ?1 o0 k
- }
& v, W1 G/ E2 \0 X) l" x5 R - }, c$ ?, r4 W1 Z, [' {2 Q0 |
- }5 h3 c- i8 Q7 | L0 h
- })7 X5 k- c/ A5 Q7 l0 o/ L: n5 m' e' ^. n
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 " a5 Y' z4 k: L% [7 U6 o# X+ V$ 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 }。
# M& K) o$ z/ K+ ~# g1 Q
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。) J/ T$ r1 v* ~; |0 l7 v
以下实例演示了这些参数的使用: 实例0 w: {% R7 Q0 n, ^
! b# h9 U' O, z9 P* E* h
- <div id="app" v-runoob:hello.a.b="message">
7 T8 w) } g" t7 Y; F7 r) D - </div># |. k+ p, [* p- D
-
3 k/ E$ Q) _7 e! C: S* H - <script>
2 F6 N- r6 }& {1 ?$ ? - Vue.directive('runoob', {
( a# f# N0 E' x - bind: function (el, binding, vnode) {
+ c, E5 Q- t+ [- X, m' {7 W) A - var s = JSON.stringify2 N5 d2 X' r: ?9 q) U. u% S, }
- el.innerHTML =
. S& I% x. m' I2 n" Q& _$ M/ D - 'name: ' + s(binding.name) + '<br>' +0 O2 z# y! R) i8 d+ P
- 'value: ' + s(binding.value) + '<br>' +
* `9 U, l7 x2 p# `1 r+ I9 e/ G/ _ - 'expression: ' + s(binding.expression) + '<br>' +
) t0 F# p [6 w" v - 'argument: ' + s(binding.arg) + '<br>' +8 I7 A$ w( h5 v
- 'modifiers: ' + s(binding.modifiers) + '<br>' +3 q8 [0 r0 B6 Z& G
- 'vnode keys: ' + Object.keys(vnode).join(', ')+ H0 l3 C3 O! V/ q- S
- }
7 q' b" F. t7 {& V - })
0 A9 @/ Y; D1 r$ r3 Y" R - new Vue({" B( w3 A& D* F6 A/ r: v' N
- el: '#app',( t/ S- p" P* P$ W) K$ r7 S$ \
- data: {
/ f/ g& Z% w4 }$ B* S; @3 z( r - message: '菜鸟教程!'9 x5 r# X( o9 }9 j7 ]. A* d
- }+ k9 ], n$ T% f/ u
- })( S9 B Z- O0 u- F
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
. ~7 o: l% \0 U4 p6 C% @- Vue.directive('runoob', function (el, binding) {
, f" _$ S2 }7 E) B; L - // 设置指令的背景颜色% Z/ | U: Z& Q
- el.style.backgroundColor = binding.value.color+ _/ R7 |# _. k1 d, R- F* R% `
- })
复制代码
; U+ N% B4 {( A1 l. p; M+ p0 t U
/ C5 j/ P; y$ N指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
+ a; f3 R2 j& `1 N* E4 l+ c# t* P/ ^# T/ P c9 P
- <div id="app">" f) E- y5 i5 s* A8 r; v- {
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
9 g, M; D( A5 k- P- D - </div>
/ Y5 L2 G' J6 f8 A3 ?: E. v, M$ R M, m: }: Z -
( q" V9 X! P' t. i7 q: w7 w0 ^ - <script>
: i7 u$ }8 K* k5 m2 a7 C - Vue.directive('runoob', function (el, binding) {
, k/ m& ^( O/ f: i# y2 X, \ - // 简写方式设置文本及背景颜色$ z, k8 x* q8 ]- y
- el.innerHTML = binding.value.text, K6 M; E+ Y( |. i
- el.style.backgroundColor = binding.value.color
8 S" ]+ c9 e8 @, |, z0 ^ - })
* `1 l% a/ m; F- i - new Vue({
( ]5 b9 |& ~& Z - el: '#app'+ k+ {) r6 W. G0 _
- })
9 Q8 S7 s* Q6 G; o$ V6 S - </script>
复制代码
' G0 w" A/ m0 w' |5 j7 M
1 T' |5 Y# H: g$ E, W
% R0 `8 R4 T% _9 g" O, ^# ?% _* ~1 u- a |