5 a1 z/ Q& B8 A% W" Y! X8 w3 T7 @
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
y* g" D7 o! S# @7 r) o! h7 j" T/ W& Q
- <div id="app">6 ]* |1 L7 S# U3 V5 a/ D+ m4 x4 j
- <p>页面载入时,input 元素自动获取焦点:</p>4 W* k7 _$ j: R2 O
- <input v-focus>
2 q9 [, X1 o9 e9 W4 B8 Q$ o - </div>' }0 t6 L5 D# ~. r& S+ c9 e# ^
- 8 _9 g# o4 W% B' K7 b
- <script>2 j3 H3 F J m. \& F4 f
- // 注册一个全局自定义指令 v-focus
5 `8 D1 W0 O( y' K- R - Vue.directive('focus', {+ B8 q M4 c. d# e
- // 当绑定元素插入到 DOM 中。5 E J# v- z0 v. a5 }9 ~; I8 D
- inserted: function (el) {+ b6 n4 o: g& l% X" |
- // 聚焦元素( X) B9 [) t0 G' |" c& i, @3 R
- el.focus()
2 t3 l+ E, i0 e - }8 M, Q" T/ @3 b" u
- })
1 d7 o, W; L( s# k6 s - // 创建根实例
! x$ O* l+ F6 W7 y4 A - new Vue({
: }# F0 v- C$ r: f& W% L" m - el: '#app'
9 s7 X* R4 L1 X$ m - })
3 l( z. A1 s; ?2 ]) {5 d3 t - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例: C& g7 }1 F B6 @% x% f3 `4 F
, q5 n, ` F; n4 c! d& Z* l
- <div id="app">5 l! ^- S& k6 x& r- F
- <p>页面载入时,input 元素自动获取焦点:</p>
9 x9 I* ^$ w2 O, l4 Z, |$ v3 b - <input v-focus>
* l7 M, }1 y& K" c9 R/ G& L - </div>
/ H! i& d- w* ]7 S2 M( n -
/ V/ h' j }/ b0 g2 B/ I% W5 b - <script>
+ J% n+ v1 {* F3 w6 v. | - // 创建根实例
. h* A2 Q# S5 d, Z - new Vue({, S. l1 V; b4 O# m
- el: '#app',
4 z. {) L6 N$ g- e9 A; o2 r- i - directives: {2 D. V8 a; Z' u3 d4 v% | H
- // 注册一个局部的自定义指令 v-focus6 Z# d7 T. E$ Q) m" s
- focus: {
% _% P7 g$ X' }6 i - // 指令的定义& O- n% P) G9 I H' O
- inserted: function (el) {- q6 n* W( C( I' @' V
- // 聚焦元素
x9 w" E: y( C8 q, i2 ] - el.focus(). }6 a# P/ N! o& D# B* j) F+ k% U
- }6 O. L$ `+ _( U- g9 r) h. _
- }
6 K+ Q/ B0 x/ h" e2 C: B - }
; g y, S$ p# @. |' ^ - })
# c" {# [7 Z# v4 O - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 ) ]% W( z3 ^$ S5 d6 W- d
钩子函数参数钩子函数的参数有: - 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 }。2 w; j5 B% O4 w8 D1 c+ E
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。8 @; P/ Y5 G1 b
以下实例演示了这些参数的使用: 实例4 i. S# H8 b) b4 y8 ?, |4 N* A
: k3 E' i$ j% D2 m: L, y8 A' Z1 _- <div id="app" v-runoob:hello.a.b="message">
; E: k, }5 _6 E3 M% M, @: G - </div>) Q. f% ?, z; Q& n; F! H4 ~" Y
- ; V0 e7 G- |9 t% s0 q* F* B
- <script>4 q( W( E0 x; m; {% c7 L7 ?
- Vue.directive('runoob', {. u/ u' ~$ b e7 v
- bind: function (el, binding, vnode) {# |9 `1 j) d( b$ P( x5 b/ D( A
- var s = JSON.stringify( G* E% P, w( {
- el.innerHTML =
9 y) c( ?. v1 ? - 'name: ' + s(binding.name) + '<br>' +) t# ~, ?5 q3 l# \, @' X
- 'value: ' + s(binding.value) + '<br>' +( D* }4 Q2 O$ D9 [. T: e: |: l4 }
- 'expression: ' + s(binding.expression) + '<br>' +( k; j" m) F2 c c
- 'argument: ' + s(binding.arg) + '<br>' +
- q/ K/ g% S9 b1 h6 E3 z - 'modifiers: ' + s(binding.modifiers) + '<br>' +
$ [: G* o) h7 |6 g! F/ q - 'vnode keys: ' + Object.keys(vnode).join(', ')* e8 F- K6 {! S% ~/ H& G
- }) X7 k" \$ } N8 t& p% D3 h. ~0 Q
- })2 I9 r% ^! l* Z5 ]3 q, r
- new Vue({+ ~0 Y _% s+ b
- el: '#app',
$ x \6 P2 s" f, o/ E; X3 t- C7 V - data: {! I& _% F" z" o" K' I
- message: '菜鸟教程!'
1 g; G/ C/ t6 T! p3 _( Z, c - }" w# |; s/ A1 Z0 u: O1 W; R
- })
$ L# A* \8 v' e; P' {, ?( q1 L - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
7 L5 A, \5 _8 ^+ X' Z9 C- Vue.directive('runoob', function (el, binding) {7 j% u7 X2 |' |/ g, i9 d m
- // 设置指令的背景颜色: P7 q3 ~9 |, K* l
- el.style.backgroundColor = binding.value.color6 q/ V" B: B0 H/ s& z7 m
- })
复制代码 : Q- j' F; X0 [! Z$ D, N
& V2 r1 G8 h5 W) O; a指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
[; c3 o. a+ [ q; C& H3 D6 ]1 V; ?
- <div id="app">5 T4 [1 t. _& I9 R) r- b. n7 ?
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
+ a5 }7 Y" f3 K( z7 z - </div>
/ d; F! T+ M+ M/ k+ ?+ f1 F - 1 T: \ ?" Y# o7 d
- <script>
i$ R B \" o5 |- L% K - Vue.directive('runoob', function (el, binding) {7 a/ f0 B; z; }( J. x, D+ }
- // 简写方式设置文本及背景颜色
1 L/ O9 C, ]- ^ - el.innerHTML = binding.value.text- e/ W' B' K: i7 o B. t' y4 ^+ k
- el.style.backgroundColor = binding.value.color h% h. s% ?) U9 b7 C; Q
- })2 x/ p' X( O' o. @; V+ ^
- new Vue({' {) U. w P- m3 a' b
- el: '#app'- J2 J/ M- l* R0 ?! j |! W9 v- U
- })
* ?% p' O& R& h0 W' ]3 O - </script>
复制代码 - n# c5 O+ T) P3 _4 b* ?% f& G, X
8 X. U* {: f8 z& Y/ [. f% _; m
% \% @" f& g" p* {- y |