" z! | c0 {, g& D
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
! k& d/ ~3 w5 h! Z. b; i5 i5 }( L! y8 \ |! K
- <div id="app">; P4 c% M* g2 K. x# }9 a r
- <p>页面载入时,input 元素自动获取焦点:</p>
; \: L- y# Y7 h; O9 Y0 X - <input v-focus>* K8 R$ W) `, T- w; c6 F% w
- </div>
: b* V3 ~3 o" R: f -
; R I, H7 Q- b& g$ d! S - <script>
5 K7 D; o+ ^) w5 L- Q - // 注册一个全局自定义指令 v-focus
n; U# V& A) p - Vue.directive('focus', {
. F) m, p& i8 p* _7 m% o$ N7 b - // 当绑定元素插入到 DOM 中。
9 ~0 W7 C- i7 ~5 x. Z! R: Y+ X) c) n - inserted: function (el) {8 I4 B' y6 T% }, J
- // 聚焦元素
3 Q) q* v1 [# j& g* ] - el.focus()
+ L' `5 p( J' l$ G3 w V - }
5 Y4 t: w; h3 ^5 z u9 c* L - }). X E% T7 P' Y' }& w9 i
- // 创建根实例4 r4 c' C3 @# N p
- new Vue({
( y* b6 C4 U& w6 d! W1 q - el: '#app'
5 ~+ X. U+ k0 y6 }; v9 z& j0 P - })
' W3 t! j7 }2 k9 N* |7 T4 Z, Z - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
2 x# Q+ U) R2 a$ o+ _; Y
' r+ Y s. S" D( C9 t9 J- <div id="app">
y, q4 R, e4 C3 m5 W - <p>页面载入时,input 元素自动获取焦点:</p>9 L# N+ |8 f' k9 ?
- <input v-focus>7 r$ \9 W$ i5 j9 Z8 \5 C& J! {
- </div>2 }2 ^- Y1 E: s& V
- ! r! Q0 [, N9 z4 L
- <script>+ K) A- k( |2 k) d6 D
- // 创建根实例3 V( A+ @- p+ @
- new Vue({
7 G& q& D$ Y" l7 Q! o0 \& E! |/ D% a - el: '#app',( E. l: C; t, p
- directives: {5 x6 R5 n7 t" `
- // 注册一个局部的自定义指令 v-focus. w" R9 p; h F. i J8 O
- focus: {( H3 }1 t. i! W4 O
- // 指令的定义
" @# Y1 Y! U1 ?, O* P - inserted: function (el) {6 p+ ^* y; O4 T& |. z" c3 K3 c6 D
- // 聚焦元素
5 h: e5 @& `! }/ O7 l - el.focus()* j7 o' ?$ Y! C0 e( k
- }* D, l) g' D& }8 I
- }3 m' x! [' N- U
- }
& U; r1 v0 a q/ C6 Z* R! f* h9 m - })
% ~& k! [2 v @% q* _/ l - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
1 H1 \8 ?# o' f, g. p% l4 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 }。
3 E1 ]& N7 E. Y
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
7 h/ U: ?: G2 d8 `! [7 V* y
以下实例演示了这些参数的使用: 实例
2 f' Y5 B# R8 M1 p* e/ W- B* h6 M1 U* J
- <div id="app" v-runoob:hello.a.b="message">
6 F7 @( M* o+ V# S - </div>) c! X; Z* J: g! z1 J0 G4 ]; T
- $ h U& g$ g) ]$ A# l
- <script>
! J3 k. A9 b3 X% Y1 A% L - Vue.directive('runoob', {1 B6 r& `, M. V" Z( M, Z: z
- bind: function (el, binding, vnode) {3 k9 Q' B0 O6 j$ I6 H
- var s = JSON.stringify
8 ^$ v0 s# K ~! i - el.innerHTML =
. y' G( ^. y( B7 b - 'name: ' + s(binding.name) + '<br>' + J% Z( K1 b, f/ X
- 'value: ' + s(binding.value) + '<br>' +
4 u0 x5 X! O; T - 'expression: ' + s(binding.expression) + '<br>' +" K: R# [% S6 r1 \* e$ u
- 'argument: ' + s(binding.arg) + '<br>' +
- r: B; X- A) b6 A" ~3 n% O - 'modifiers: ' + s(binding.modifiers) + '<br>' +
$ Q0 J0 b; \) T7 L - 'vnode keys: ' + Object.keys(vnode).join(', ')
# O% h' _' s; j# a - }* ]4 j0 s3 S/ V
- })* ~, U1 z+ J4 F2 T
- new Vue({
8 m9 L: x) O' H. h: T - el: '#app',: q7 r, {, j9 @) q& I
- data: {
, A- ?7 |+ G' i - message: '菜鸟教程!'% n; S5 ^- S3 K8 i
- }
) M5 Y$ q. B1 A! B2 B0 ~* Z - })/ ^5 X2 v7 x; i5 z4 z, |
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:# m/ S) J0 J4 M4 D9 _3 s
- Vue.directive('runoob', function (el, binding) {# Y2 D0 \* C" r, u Y4 M, W" O4 b
- // 设置指令的背景颜色
6 ~' a2 Y2 `9 H - el.style.backgroundColor = binding.value.color n+ S9 K+ ~: p% n, f* d6 j0 |
- })
复制代码
9 ~6 s' [. ], e- ? B8 `& o% O- O, |. w# S3 h2 f% `
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例$ s' H' b* S9 U0 B9 Y# s( C+ ~
4 f! ?4 D1 f% _- <div id="app">
) q m) n2 S1 c4 g$ f - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
' B" ^% Z$ O& j/ V7 o# x - </div>
1 E9 i& m' A, {2 }; \ -
$ x& _7 ?# O8 Y: Y, n' G - <script>
% a% N9 }! L4 O - Vue.directive('runoob', function (el, binding) {
7 c6 J; `7 c2 p7 ?5 u# n1 J- ` - // 简写方式设置文本及背景颜色3 o" u5 S) X5 ]3 y! a
- el.innerHTML = binding.value.text
) ?# Z; N" _5 X O& y5 M: ^ - el.style.backgroundColor = binding.value.color, B( Z8 F8 j5 s# @% ~- C
- })2 }2 @- f5 n Z' A
- new Vue({5 k1 i" K( x5 T. f3 Y9 e
- el: '#app'1 m7 |9 U0 w E$ r& a$ h8 r( v
- })' F ~. V/ F% C
- </script>
复制代码
3 D# R: m! |5 B' b8 [4 y
- Z+ [3 A$ [2 S+ [: Z3 Z& W3 n2 K0 _7 l+ R0 f8 H$ T; K
|