5 E$ X: D( K# ~/ Q0 }! x, I6 g除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例# L' P; F, d9 x' C& L& F7 [$ g
9 w1 I3 V2 Z' j8 c* k( h8 m- <div id="app">
& x2 N- I, l3 u - <p>页面载入时,input 元素自动获取焦点:</p>( Q3 e! I( J% v W3 S
- <input v-focus>
. p' ]& g5 Y1 |; \# P; A- b - </div>
/ H6 P# x- v/ y. L9 E* S5 d! b& v7 h - ! Y5 f/ e' i+ O- i7 _0 @
- <script>2 a1 M# N+ j& D7 v- H/ ]8 H
- // 注册一个全局自定义指令 v-focus
4 P) ]* S$ h. ~8 q% ] - Vue.directive('focus', {0 B, E; t! r* \8 P: y! a
- // 当绑定元素插入到 DOM 中。8 P Y& P' E1 R+ n! b
- inserted: function (el) {& h* {3 d, u) E: U4 c
- // 聚焦元素+ [) V4 s/ C2 n8 o8 J: v) @
- el.focus()
. ?) b/ g+ n& c2 L7 X - }* K8 l- L- q: v
- })9 L' C4 X; q/ |8 y, o
- // 创建根实例& O0 m* p5 f0 |: |" o
- new Vue({
, K' H: ?) d' v% E i1 N - el: '#app'7 g. i2 o1 S; X5 ^ U7 s, g7 d
- })+ ]. W a) G7 e
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
6 E; ~6 ]9 s4 O/ N( r9 S5 U, Z6 d1 k: C; G' c5 s% Z& I
- <div id="app">
5 [0 x4 F4 c9 |9 K& {- { - <p>页面载入时,input 元素自动获取焦点:</p>
* T; y8 [/ f+ ]( |( _4 L - <input v-focus>
: G7 j& E2 b% [4 Q# v - </div>/ R! n/ _& W" B- a
-
, v F7 r0 K' }. {- K4 [' Z; Y& i - <script>
% J9 X9 u5 v- Q( Z. a - // 创建根实例
& `# c! T$ A$ Y; u |( Y - new Vue({* f3 f4 C; R: O, {1 r# N
- el: '#app',% |- E# z. K% y6 E
- directives: {
( Q. F0 o0 \: f6 s2 V$ ]( ? - // 注册一个局部的自定义指令 v-focus( i5 s/ P0 q- \2 C& l* f3 x$ p
- focus: {7 w" \' v% C( l, l4 Z7 w5 E, |9 y& t
- // 指令的定义2 Y# ~9 n) U8 z8 f: b5 S) I$ U
- inserted: function (el) {. R R4 m* k# C
- // 聚焦元素
9 A& n6 X% q; N& ]' M - el.focus()
5 C; u; S5 B+ k* u5 m, Y% Y& d - }
, b' j& u& v, ]' U1 H" ^) K - }3 Y7 O. N+ H* K2 j
- }# W6 l1 ^1 ^* K8 X, y P0 J
- })% i+ m9 G* K4 z
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 6 [7 b" w7 B5 {' D6 V- g& R% i
钩子函数参数钩子函数的参数有: - 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 }。. y# z) S, G7 \3 m
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
3 R: S# V2 z9 V( Z9 H+ W5 X% Y
以下实例演示了这些参数的使用: 实例
4 v' F6 r, P( J! |0 k' D5 ~- o4 r% r/ @8 M, T7 l/ ^
- <div id="app" v-runoob:hello.a.b="message">/ e- c7 _9 Y1 b9 G) X4 Y
- </div>
: x, w; _3 P1 E" m `' W -
( H1 c6 Y: Z2 N3 p - <script>
* m% r- e7 W$ F2 `: _6 Z - Vue.directive('runoob', {- S3 d# _ y1 z ?+ D) f% _' I- Z/ _
- bind: function (el, binding, vnode) {
& ^4 G0 u* y9 a& y7 f - var s = JSON.stringify/ J6 _; S$ L5 g8 u
- el.innerHTML =
2 v/ M j! T0 b - 'name: ' + s(binding.name) + '<br>' +
% z/ T: a& p5 C: G3 P( ~ - 'value: ' + s(binding.value) + '<br>' +0 X% c! F8 k) g m" T, s
- 'expression: ' + s(binding.expression) + '<br>' +/ ]2 E# y( M' w3 K
- 'argument: ' + s(binding.arg) + '<br>' +5 m: C5 v% p( N+ G
- 'modifiers: ' + s(binding.modifiers) + '<br>' + V' m1 d8 R+ G: t
- 'vnode keys: ' + Object.keys(vnode).join(', ')& K- {0 Y8 K" X4 S! f
- }
6 \3 |4 H& p7 t' U7 A: g$ x - })+ v" S3 g4 t5 J3 S. k
- new Vue({% x9 I* j+ G" O+ J+ d/ a8 S8 }9 D
- el: '#app',
q! x9 z8 s2 a' k - data: {
! g ]+ v% [) R' ] B6 X% _) J! ^ - message: '菜鸟教程!'/ Q" z- u4 G4 i: z
- }3 e ]: ?: m! E$ d0 X8 k% X/ J
- })
3 ]/ |# u+ k e* j2 R0 m4 N - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
( }3 Q* t& u% i2 ~% K. ?+ a. n- Vue.directive('runoob', function (el, binding) {- v& H. Z2 ~8 Z {
- // 设置指令的背景颜色
7 ? e p* r/ v - el.style.backgroundColor = binding.value.color0 S. Z6 O. J$ ^% s: m9 x
- })
复制代码 3 R, t4 U4 k9 B; i
H7 X" W6 N4 @. A
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例& h3 ?* `4 T, s2 ? y: S) D# u
9 y- E$ p/ q) Q$ c$ G# H
- <div id="app"> h7 t0 j# b! P0 D) V/ H
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>8 M! [! { B! s0 U8 ^, F7 a! u
- </div>% v0 y5 O4 v' z9 m! a+ C
-
5 ~+ A; l$ ~% G4 s% ?( w" E - <script>
9 o$ P+ J B7 l - Vue.directive('runoob', function (el, binding) {% g$ g& ^$ C8 E; l" g, a
- // 简写方式设置文本及背景颜色
4 C: M5 ^3 h; K% r1 T - el.innerHTML = binding.value.text
! r/ C, A6 b+ V- j - el.style.backgroundColor = binding.value.color u' I; }" T8 m) v; ]
- }): I& a! u& d1 q4 k2 J* k
- new Vue({
/ q$ N/ P6 L+ G6 H6 g - el: '#app' `6 F- b& G# t0 C/ k0 K
- }); n; M0 G1 G0 r; @
- </script>
复制代码 : B- a! g4 W* w0 I! S
+ u+ `! p7 }% y; t9 ?' Q- }
/ a# Y, V6 J6 ?" B8 r |