; `$ O' ]6 e6 n除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
) \. V. ]% d* R2 d6 n- c6 S- {. X4 r+ ^+ N; T: P
- <div id="app">
0 D- X7 ^9 @% q0 {5 s - <p>页面载入时,input 元素自动获取焦点:</p>) L/ ~7 {* c, l% }
- <input v-focus>
3 [ x! t/ a+ T; R! i) w - </div>
; g b3 s; ]! d$ v; D% W7 S - , d5 W, ^5 h, `0 n( U
- <script>
1 D: G0 q* T, y% t1 h5 i( ` - // 注册一个全局自定义指令 v-focus
" t- q/ w& G& Y3 m' y' e' T& [6 ~ - Vue.directive('focus', {
: K9 V. F. [+ j( w4 u$ |% y! q - // 当绑定元素插入到 DOM 中。" v$ H% E9 f- E; [* X( J
- inserted: function (el) {9 m( \; u, U% X. t
- // 聚焦元素8 w0 O' Y# [& A6 ^4 m, w0 `. M2 U- P
- el.focus()
4 K, H$ h* G2 H1 b - }
" q5 h8 l) |, E, |0 T: B - })
$ V0 T% R+ h& m8 ^$ z" O+ B - // 创建根实例1 T' X% O' u9 I, {. f9 ^
- new Vue({
& ]& w! _& l, a+ J, f: Y5 j: z& l m) {) f# _ - el: '#app'
( u* Q2 ^5 ]( T+ u - })
h @* Q3 H d# C4 Q3 ]1 U( A - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例1 E+ B+ |1 e, b$ e
" c9 Z4 _2 Z( g; w6 K% C- <div id="app">! Y; w9 l7 p2 h7 L. {: @
- <p>页面载入时,input 元素自动获取焦点:</p>) @* A# K! i4 z, \( C
- <input v-focus>& v; v& T: x8 c0 J- ?
- </div>; W% a- r9 E4 i9 Q' t& q
-
! K% N' Z) ~3 e5 g - <script>
) u; t0 i$ Z, y3 n4 h6 n - // 创建根实例
) v; a5 m: u2 ]7 `3 l% w$ L - new Vue({4 p# t0 Y3 Y" X. g4 i
- el: '#app',
# m8 T2 i+ Q. T. H) v& d. x - directives: { m) @9 U# J% {
- // 注册一个局部的自定义指令 v-focus
F3 y1 C* _5 f/ p2 a- e' Y7 k - focus: {7 h1 R) W) {1 E1 v- G' P
- // 指令的定义
1 y9 T6 D6 u# h: \- k" Y8 M9 Z& u - inserted: function (el) {
+ d: `* U0 Y1 W1 E( O- q' T - // 聚焦元素: m/ D' v- P! m% q$ r) L. ]) j
- el.focus()8 y2 P4 @& I ~2 r
- }
# p) F! O! `. b+ L5 v - }
% g% ~& @+ F2 `- N. J! e) D - }
/ O4 M& Y5 w' |# c& U - })
" R) j/ q, u) J6 v. u - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 $ y- d& K( G4 ]' 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 }。
( q5 K( t' v, U# r1 d
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
4 [- v5 X6 x# b9 _+ F% C8 }" s
以下实例演示了这些参数的使用: 实例. G5 A* J6 n( D' }/ C( V$ S
( W) z# A" X/ Q1 B- <div id="app" v-runoob:hello.a.b="message">
: `8 \1 T2 S* m- f/ h& e - </div>6 T' Y4 `" n8 r% P% H: e( r
-
& \! u" D8 P1 w - <script>8 @+ A$ o* B* P! A; `. p
- Vue.directive('runoob', {
; V! l1 d2 K. Y) n$ N1 K! ~ - bind: function (el, binding, vnode) {4 Z' O% Y; F: _1 _& E
- var s = JSON.stringify* h( w* d4 Z5 k
- el.innerHTML =
6 J% u2 w& P# h7 V; ~. \* p - 'name: ' + s(binding.name) + '<br>' +4 g0 y& W' U% Z' _
- 'value: ' + s(binding.value) + '<br>' +
: ?/ C" r1 T5 O( \' R3 l8 H; h - 'expression: ' + s(binding.expression) + '<br>' +. A5 j$ x6 [% K6 X& P
- 'argument: ' + s(binding.arg) + '<br>' +' c: |4 s( o9 T7 a
- 'modifiers: ' + s(binding.modifiers) + '<br>' +8 s& L' w: R8 d$ g3 Y& i+ q
- 'vnode keys: ' + Object.keys(vnode).join(', ')/ R9 @9 ?# Z* `- v s' I, {
- }
7 a P" i( V$ }+ X$ y$ k - }) n: J3 C8 e( A2 \, W2 T+ |
- new Vue({! [ ]- Q" W" V; l
- el: '#app',
3 F, O$ N, u6 Y$ | - data: {
1 K6 W# f- z& { - message: '菜鸟教程!'0 g( C. _" w- i7 @
- }
' @. H" K7 ?) y0 t - })
9 R! Y! ?+ Y( i; h6 \7 ^1 p - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
' \) V; `4 t: v" ]! k) n( e, e4 s- Vue.directive('runoob', function (el, binding) {/ ^& c8 p( C# b# |0 r( i$ C
- // 设置指令的背景颜色
9 d+ L9 a( x" h" V# S - el.style.backgroundColor = binding.value.color# ?. Q0 M6 ? I, |2 ]& n
- })
复制代码
; r0 ~/ O& W+ G/ Z$ A: ~2 A5 U6 [) Q c. G
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例# t* ], R! [! v: R- n8 }- w1 g" O
/ ^# X+ V4 N9 W. R: I# ]
- <div id="app">
I( D2 n$ `( t5 g. V - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
1 u" q5 a6 ?7 B! q" Z0 o& V - </div>
% t2 u: F; E9 G5 ~' L - 9 A. @$ B# n5 |5 D$ G+ ?
- <script>' y9 l: \. D; i/ h
- Vue.directive('runoob', function (el, binding) {
- d* p& v+ D0 G! ^ - // 简写方式设置文本及背景颜色, b& o8 `- r" `8 E% F1 }- ~
- el.innerHTML = binding.value.text, m9 k( `4 }, j3 D
- el.style.backgroundColor = binding.value.color) q% a' r8 F: T' x
- })
5 l8 u% w+ g/ o' d `6 k6 E - new Vue({
3 q9 w! L5 j4 b- `! C$ n9 g0 [& O - el: '#app'
2 k! C" h* t' @- _2 \ - })5 \3 }, M" `) t
- </script>
复制代码 ' Y5 @$ k/ z( {/ d# q W. d
6 ~. S/ t/ w( h* k ]7 R, c. ~7 \/ F( b
|