; ?+ g) T ? ^8 H6 I0 x( t; N除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例* o7 f9 O! }* T# H/ Q, L: i& l
% J. `' J5 D5 D! R1 ]' |6 S1 m+ e- <div id="app">
; j6 \% t5 @1 m! ~9 M M: \ - <p>页面载入时,input 元素自动获取焦点:</p>
. ~7 H. i! O, c% e9 |, H - <input v-focus>
! c# Y* c$ B* j: @; g& t - </div>; \# Y$ k- a! [/ X5 U7 L
- 2 d+ E% E3 J. F# r
- <script>
7 [6 l$ d! T2 p3 { - // 注册一个全局自定义指令 v-focus
+ n: h2 q) L+ l$ [- a" u5 {% R - Vue.directive('focus', {! u5 w+ P5 D- h3 y
- // 当绑定元素插入到 DOM 中。
; }( J& v& Y# q+ Q6 T; a4 e - inserted: function (el) {" ?0 D1 e6 t* T
- // 聚焦元素
/ e- z) `" R5 j% Y6 S4 \3 L - el.focus()
4 Y3 g! N( \1 C6 {# `/ n& R$ p2 @( H! z - }
5 g5 n- v8 b$ @ - })
4 u5 l- o/ f7 y2 F - // 创建根实例0 H ]: r8 W' G
- new Vue({% T3 s I4 j! o' T
- el: '#app'0 u! b+ I4 s8 \
- })9 o, C5 f" E' s2 G/ ?' J
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例/ G4 e% L3 v x$ Q
t" o8 X2 R p$ m3 j3 B8 Z- <div id="app">/ {+ G/ h5 g5 d) Z4 n( ?
- <p>页面载入时,input 元素自动获取焦点:</p>8 r1 o- ^1 C( s) t9 u7 A
- <input v-focus>
' w6 S# h0 o( U2 N - </div>
! Q& g, y2 g5 `5 \8 _1 b! G' \- Z - + ]5 \: @3 j& O0 |8 a
- <script>. u' m! N* G/ t3 K; W
- // 创建根实例 D* F5 D" P9 t/ Y0 R% e
- new Vue({9 J/ |$ a% u; h7 D; [" O
- el: '#app',
" u/ I' G6 W0 e6 E: k1 z - directives: {3 ~" D) O! g7 n
- // 注册一个局部的自定义指令 v-focus- A$ H3 w1 ?7 b' t, }# L
- focus: {
1 U! K4 d. m7 s# ]9 v! D - // 指令的定义
# W. a+ @$ B( s* v6 b' _) A4 ]0 S8 {3 y - inserted: function (el) {8 C, o* G! |! K c m4 a: S
- // 聚焦元素
$ b4 _+ @" l! a: Y. L; d - el.focus()' N# L/ K# t0 E& t
- }
# K% O6 Y- R8 j - }
+ I# Q+ }. E& X; F% U8 b3 V0 ~8 n - }6 M @9 i( l4 ^. h
- }). S0 z( X8 a5 d3 X! X
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 2 o: H; ~" ^( H. E- R6 E4 p& K
钩子函数参数钩子函数的参数有: - 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 }。! w% m* s, f1 j. U! t2 c
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
, r; G5 }. V$ y- l4 V
以下实例演示了这些参数的使用: 实例
: M7 C" M- q: v2 E0 w- h5 Z# g* x0 A* i5 t' o. B t% K: g' A( C- o
- <div id="app" v-runoob:hello.a.b="message">
3 b: P5 b$ E2 M: Q8 y" o* S, D/ g - </div>
+ d' u4 P$ M$ x. R& U5 O9 n { - 3 i/ f# g( ~" D( q% w, |1 P2 y; P
- <script>% {5 T Q, ^+ s) }/ B
- Vue.directive('runoob', {
) R8 S" L# M" w! ^ - bind: function (el, binding, vnode) {
! ]# \% @2 C! x: }6 e8 W0 s: e - var s = JSON.stringify' ^8 O& _0 ]+ S8 r& C; C
- el.innerHTML =' D1 n- Y+ y: q* O/ n. v; t
- 'name: ' + s(binding.name) + '<br>' +. i# N$ K! k2 L5 [& S/ Y
- 'value: ' + s(binding.value) + '<br>' +1 F! d7 r R% z* Y' k* x
- 'expression: ' + s(binding.expression) + '<br>' +1 H* F. Q0 C d$ Z0 {
- 'argument: ' + s(binding.arg) + '<br>' +/ O4 @6 L0 I% z: I' J. r
- 'modifiers: ' + s(binding.modifiers) + '<br>' +
9 }' ?0 P8 l5 W3 R; M - 'vnode keys: ' + Object.keys(vnode).join(', ')& U% z |1 J3 R0 g, E
- }" ~; C* k& G) a0 ]4 Y8 s
- })% l; O7 e# C* @# t2 Y
- new Vue({! k# Z) w7 `. G1 o
- el: '#app',; I _& n2 B9 g0 j5 Q4 i& {6 E
- data: {
8 k; Z; _( k( }5 p0 Q - message: '菜鸟教程!'
, s9 l- d( z/ }7 W: ^) R - }
' _) U$ v4 z r% G/ ^ - })$ p( [% U! t* b$ f2 j4 l
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
. N/ C0 o2 _: S) K. b/ L( t5 Q# a- Vue.directive('runoob', function (el, binding) {
# b7 I6 V& P1 r$ a! w- B$ s4 X - // 设置指令的背景颜色2 F# V' O3 Z9 I5 V+ s
- el.style.backgroundColor = binding.value.color
! [& H; [8 ?1 {/ c; ^ - })
复制代码
, u( E1 M3 w p# {( k, Z; s
( |* o/ F) I$ u2 I Z% y4 b指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
) K( G r& B f( c# ^+ ~, l5 k! D* s" U" I2 p. F9 L5 ?& G
- <div id="app">0 L0 a0 T9 i" g' g8 {( ]5 m
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
, T* E6 Y/ i% W; l - </div>
9 m' S- D* `- f. F - $ }- k2 t2 r6 s6 X5 j$ ^$ [
- <script>4 c. l& `2 t/ X+ T
- Vue.directive('runoob', function (el, binding) {
* x0 }- M9 k7 ~! `* @7 j - // 简写方式设置文本及背景颜色
( U' x) M1 F# q2 z" j- o - el.innerHTML = binding.value.text" } S/ V, [7 E1 ~+ L% k% [/ j
- el.style.backgroundColor = binding.value.color( Q* w# k# }# p p
- })
& F5 c) d+ d8 F' G - new Vue({
) f) b2 s e6 H' [ - el: '#app' U8 S& H! m# ]
- })* i$ h i, [, [6 \
- </script>
复制代码 ; s6 w' x( n- L: L
) V e: D1 l! ~7 `1 v% W
1 t7 w% P4 ?9 T
|