( u$ a. Z; _7 ~0 t
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例4 Q8 X8 c1 d Y3 p
; N2 J, k# M4 {/ v2 P, m2 ^
- <div id="app">
w# N9 m$ u3 C, y2 Z - <p>页面载入时,input 元素自动获取焦点:</p>
* h( o/ C$ n; z+ n: R - <input v-focus>, r [4 z" |$ N" l1 z; I
- </div>
" J7 p G: A3 y) t/ ` - ; X W! T# Y0 t8 [
- <script>
; ]5 S# p7 u# }9 n7 \+ g5 ~* I - // 注册一个全局自定义指令 v-focus' i; Y7 r, |8 U
- Vue.directive('focus', {
- N5 o8 a' c% a' z6 t4 T3 { _ - // 当绑定元素插入到 DOM 中。4 J1 w& S4 k G7 z; w- t6 C/ o
- inserted: function (el) {# r9 _; O% t O' e% C
- // 聚焦元素5 f2 b6 `) f7 V- {: g
- el.focus()
1 I0 r1 ?7 ~) I3 M) Z& c" c - }
0 i9 n* {: o& ~8 Y! ~- z$ Q - })
* n2 ?% l$ \6 u* F, U8 _; K) s - // 创建根实例2 E& W! i6 }3 F) E
- new Vue({
8 R- X; f9 r2 e7 S& z7 {1 c# g7 u - el: '#app'3 ~: f. \' P( l( L
- })6 O8 k" o: o1 i q6 ^# E7 y
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
% r+ ]3 q# N, G8 R9 l" M/ H5 Y4 Y
- <div id="app">% I- Z% x& o, K) ^ N
- <p>页面载入时,input 元素自动获取焦点:</p>
) s; r- M+ v" Q( ?! W5 c. m - <input v-focus>
/ R& p [ }3 D - </div>9 ~: z; e+ A8 e8 P- C6 X
-
/ h3 y: w& | @2 v - <script>
1 C% _$ H) E& a$ F* F1 N% { e7 g - // 创建根实例1 h5 p5 ~9 u6 `- ]9 c0 I. C
- new Vue({9 H$ ]0 W2 n+ Z9 b
- el: '#app',
0 o% q: s/ L4 \! ~0 Q! `! E/ e - directives: {
% B+ ~& T) A; n* J5 A+ _ - // 注册一个局部的自定义指令 v-focus" B& w0 u- v! t O9 e; ^% K
- focus: {" I# f _! v, N& ?, q# h. Q+ T
- // 指令的定义1 m6 _4 |4 J- `8 R. A- N
- inserted: function (el) {: k7 ?7 T+ Y* m$ o; k" k
- // 聚焦元素* _$ m( O4 B0 r
- el.focus()
+ m7 t' |/ @) X7 s( Z - }0 P; P5 Q5 J+ g/ H
- }+ \: g$ S4 [; ^6 H W2 S _! P3 a* O
- }
' L9 ~. Y" I$ M: _ - })
) B/ v& K1 ?; n - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
9 J# j6 y$ T* w) j 钩子函数参数钩子函数的参数有: - 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 }。
+ f: e5 R: I z+ e
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。' [ B- w- @2 i4 X/ T0 }) z$ i
以下实例演示了这些参数的使用: 实例! h8 G: W% I: @ c
4 ^& H3 J& ~7 N% f! d- <div id="app" v-runoob:hello.a.b="message">
# T- P9 E4 a/ `3 x3 [- T - </div># H5 ]7 `: @; x, K4 T3 x6 M, M- J
- # e2 M c% w9 n$ N
- <script>
0 J5 \0 N4 F& y( Y/ l - Vue.directive('runoob', {
' E! }; G, R% |$ Z/ d7 o& I - bind: function (el, binding, vnode) {
4 W* f. U: o- C" d - var s = JSON.stringify5 ~/ J8 H$ X" S! w% K$ T8 U
- el.innerHTML =/ S" C. V E; z4 K) K
- 'name: ' + s(binding.name) + '<br>' +: {# f( \% _) E2 x; w: _! K8 I7 d4 j, o
- 'value: ' + s(binding.value) + '<br>' +, H7 I& P0 k0 J* |
- 'expression: ' + s(binding.expression) + '<br>' +
* n4 P9 H; F* K3 \' I( J1 E: u1 t - 'argument: ' + s(binding.arg) + '<br>' +
, {5 N- X5 s# O" `6 H/ o - 'modifiers: ' + s(binding.modifiers) + '<br>' +
+ ~3 E+ x+ t. A - 'vnode keys: ' + Object.keys(vnode).join(', ')! c6 Z7 J% i8 `. W ?
- }
4 f/ B) ]' |- |% z% A1 c9 S- W - })7 u" T% Z8 N/ _9 Z7 N- z# h
- new Vue({
- s5 f2 i% e! ]- z: {, _# D8 | - el: '#app',7 J/ N4 B7 q" h/ H' ^
- data: {
/ [( R4 R& D, A1 @7 O - message: '菜鸟教程!' m$ J3 Q9 Z7 n
- }: ?, q% Y5 p1 G# ~
- })
|. {1 K1 l S5 K6 T# p2 e - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:$ q9 P+ q! ], N, l3 K
- Vue.directive('runoob', function (el, binding) {
9 A: r1 _2 V7 n1 M9 v - // 设置指令的背景颜色
- l8 g* ^9 w) a7 d0 y3 Z% z - el.style.backgroundColor = binding.value.color
& W1 A( E; H5 u" ~# h& ?/ ^ - })
复制代码 5 K9 y" x8 ^: g& B( h6 G
+ m! r0 D( l' V- B指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例& V$ H2 L" \0 d( a( @
- U9 S3 k. c: X3 k
- <div id="app">5 b9 J8 f5 C) B& C: M$ [
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
' |: x& _9 k; k, ?9 [3 p1 K - </div># y8 r/ s7 F5 o1 `5 }
- 2 @* g$ t) q7 c8 m
- <script>9 Z+ l8 G+ Z: x) \4 Z5 D9 m
- Vue.directive('runoob', function (el, binding) {% v/ Q6 U+ f/ G0 Y2 ]
- // 简写方式设置文本及背景颜色
; R* H! W, ]; L3 l9 g - el.innerHTML = binding.value.text
/ e: v& L5 E9 G; x8 K- r% z4 w - el.style.backgroundColor = binding.value.color" J9 b7 v) I0 G* k6 N' r" D, \: A+ u6 \; i
- })/ \6 u: Z/ |7 Z' n# u+ v; d
- new Vue({
( C0 i. @/ X3 a) v7 X2 r, G - el: '#app'1 F6 O: t4 P- J- H$ E
- })
# I( m, u( @ J4 F5 B# ~ - </script>
复制代码 K+ U, c, F3 r6 `
8 J: ^' l1 L' [& \6 P" D$ Q
0 ^8 ]9 p6 d! n& v |