# R7 v# P/ A1 y1 L3 y
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例; Q& F" s. m7 ] a2 D6 r9 a/ g
! U& G$ N- |" X! m( a0 t# V- <div id="app">! v% `* A3 t* y0 [/ ?& S
- <p>页面载入时,input 元素自动获取焦点:</p>
5 T+ i3 g; m' @" k7 A - <input v-focus>: t/ b- s: e0 o5 u7 ]2 |
- </div>0 ~8 ?" b5 ^, r
- / \$ S/ l% u( C u
- <script>+ n4 \! s% G) C3 K/ k0 {8 g
- // 注册一个全局自定义指令 v-focus3 x9 @# t* s% c0 G" Y! G4 ]
- Vue.directive('focus', {
+ m, D$ U* b& u9 P1 F3 u - // 当绑定元素插入到 DOM 中。% ^4 N/ y6 h" O' `- A
- inserted: function (el) {: m: f |& R6 s
- // 聚焦元素% p' O5 U# S0 e1 k& o! s3 q& B
- el.focus()! F& v, X! ?8 ~6 Q
- }4 d$ E% Z! \# I
- })' M- c$ _6 `& C1 z
- // 创建根实例- p1 Z5 J/ r% U0 J6 d- ^! Y
- new Vue({
% U7 ^( h# F( r6 b6 Y - el: '#app'1 L9 G: V; [1 |$ A' y8 ]
- })1 U/ A8 n: b: R* x$ j* k0 C
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例7 A6 Z" ^ g9 A$ K
+ |. u* ]: M. c8 R- <div id="app">2 v; U% N6 c* A% y7 C
- <p>页面载入时,input 元素自动获取焦点:</p>
+ Q, B4 |. L. q1 Q2 a4 O3 X& G- N - <input v-focus>8 S/ `% }' a2 L! ?! ?! h1 m% U4 D
- </div>6 x8 s! \; g% g `
- * M7 d' ]9 m3 P. u7 O6 G
- <script>9 A6 l7 _5 I( z9 b
- // 创建根实例, o& I& X$ ?" o8 `+ y& H: _( O2 u
- new Vue({
: o8 i: d+ C9 ]" P2 v - el: '#app', s, @: a- p' u! U" N- p+ D
- directives: {
) M3 I" d7 R' p4 b2 |' { - // 注册一个局部的自定义指令 v-focus0 E+ Q1 l4 F1 k; E0 w
- focus: {/ _( |8 s5 Z4 q- k8 e0 o" t B
- // 指令的定义: o4 I* z( U2 n' _7 t
- inserted: function (el) {
6 Y+ \" A% i& u# Q8 O! ]3 C - // 聚焦元素" {7 W' D# t. ?& I- D
- el.focus()
W7 K$ v3 e. \) k+ V - }2 ^6 g% V u. ~! y5 I1 ^# S* W, b
- }
Q! Z0 Z$ j! q3 |/ i7 l5 L3 O! m7 c( U - }
$ |1 t Q& I$ K8 E/ B' a% o - })) `7 E6 H! P7 a* s$ Y3 U& h; S: o* P
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 + k6 g- ^6 m. S8 v0 ^4 v% R, m# \
钩子函数参数钩子函数的参数有: - 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 }。& A2 G6 q8 Q# d( B: w2 L
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。/ ?( X J" ~5 M; K W* k
以下实例演示了这些参数的使用: 实例
0 u* \: a' D2 [1 S/ N! {$ } i3 q: [( ~
- <div id="app" v-runoob:hello.a.b="message">) i8 f9 J- x8 \- F/ N0 t$ D! k
- </div>1 ^+ l" t; w' v0 h* y! c6 y+ F
-
! c% B5 W4 o. e" U4 ^8 u$ N0 u - <script>, r. k8 W3 r+ m( f
- Vue.directive('runoob', {7 I/ K! q6 g0 K9 V
- bind: function (el, binding, vnode) {
. m ~" }! k: s" K. T! u2 b: p - var s = JSON.stringify
0 p7 L$ T' o1 R% p - el.innerHTML =( J$ _6 o! U S3 Q0 b- m
- 'name: ' + s(binding.name) + '<br>' +5 @/ X$ G1 k( J- k: U B
- 'value: ' + s(binding.value) + '<br>' +' n+ v8 a$ }' p- U! S1 H4 B, n
- 'expression: ' + s(binding.expression) + '<br>' +
7 f' v- c! w- n( V& R - 'argument: ' + s(binding.arg) + '<br>' +( J% M- t f0 c5 t
- 'modifiers: ' + s(binding.modifiers) + '<br>' +' u) H- A. g, c$ V
- 'vnode keys: ' + Object.keys(vnode).join(', ')$ `/ n* i7 R6 Y
- }$ s% r; _$ Y' R
- })
" f0 D2 H- g. \5 d - new Vue({: V8 p- ~9 F* Z. [$ N* J
- el: '#app',
7 O1 c$ ~9 Q6 [8 l) {) J" Q3 K - data: { }* [5 Y! b0 L+ N
- message: '菜鸟教程!'
/ E, O) Y1 b2 }2 J" f5 Y - }
3 X* R4 Q9 H' o6 j4 k3 ^( ~3 } - })7 |% U2 G( z3 P- }
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:" L' {# g# T% A* L( z
- Vue.directive('runoob', function (el, binding) { E- M3 f& \( w/ K" z; o
- // 设置指令的背景颜色
/ [2 |4 c; z/ h) m: `, D# p - el.style.backgroundColor = binding.value.color
, m9 U! H, z2 z/ t2 J, ]* i# z3 Q - })
复制代码
7 r/ p+ P8 ~* s$ ^
5 l7 I* R% l* ?# E$ v指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例3 A% g! X5 W& a( r4 @; i
% V' k8 M7 B: k
- <div id="app">% ~5 L" C, ~4 w& h& S4 S
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
9 p9 J- T) v# A - </div>& z( ?1 Q% ?7 S. Q' q/ E
- 1 d% A2 ~5 [2 \3 w8 k( ~, r
- <script>
; {3 z9 h6 @" L+ {' y7 H; { G - Vue.directive('runoob', function (el, binding) {. P$ `( [: b. V# x
- // 简写方式设置文本及背景颜色
( y& I! d+ N$ t& B3 J - el.innerHTML = binding.value.text- B9 q$ o3 u' B5 H8 ^! ^$ G7 G3 l% Z
- el.style.backgroundColor = binding.value.color& e0 b0 V: B7 G: g: w) x* w
- })1 c) D4 z, e* `7 H& c- i
- new Vue({$ H" \" e9 r% S; W4 f0 [
- el: '#app'
- ^2 B6 A# z% G w: V - })
" T3 ]2 t7 X, v) F' d - </script>
复制代码 1 {8 f3 X3 r& Q0 W
9 p2 c) r( ^$ E: }' ?6 o/ g
w8 m- h/ Z- M3 U' Y; x
|