8 C; y: Q7 E2 Q; m6 q
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例" D: _. g; u* f& ~7 L
7 K" Y M1 D1 ]6 s
- <div id="app">5 @) L; D- R/ O/ v* ^6 d5 G
- <p>页面载入时,input 元素自动获取焦点:</p>( S* s' t# W2 E0 O5 V
- <input v-focus>
8 h5 i$ Q6 d6 j; S- t/ ?) ~: I4 `4 h - </div>3 }4 |( |8 L' d0 {. L8 O% j6 Z- A: j
-
# H* P7 v) [* u1 n* m/ l - <script>
. r5 g1 Y2 s9 {7 q - // 注册一个全局自定义指令 v-focus( l5 q; S4 w2 I+ a2 m
- Vue.directive('focus', {
- m; U( `) h- w% ^( O6 t5 g - // 当绑定元素插入到 DOM 中。
8 J; M9 u& H7 ~8 b - inserted: function (el) {
' d) N" X a. l5 c - // 聚焦元素6 r+ V7 f& K; T1 z% D" q
- el.focus() e$ A! s0 ^7 v. d: k
- }9 U/ D! }! Q, y' J4 O
- })
: j8 d' Q) D( x' v& n - // 创建根实例
* D+ q: f4 b+ O4 y/ d9 ~ - new Vue({
0 j# N6 b% t. d5 c5 y- Z. r - el: '#app'
5 I8 K' M' `( A0 Q) Q! m% x6 @# i5 r J - })
# }) i p6 Y% F+ N0 Y& P1 a) f - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例8 z+ f. E# e3 `0 A
+ D, x x( g* w+ t% N
- <div id="app">
' O- X2 T5 w" f1 v - <p>页面载入时,input 元素自动获取焦点:</p>
T* ^$ R2 Z7 X* u1 h - <input v-focus>! J z6 o, |) ~" Y* s$ n
- </div>
' m# _# \1 C7 |) I3 z# N -
, {3 }2 m5 m* @7 V; E - <script>
6 d' l. F5 w/ i - // 创建根实例1 q$ \! j; ?4 k) }
- new Vue({" F6 ]4 [4 j8 ~2 C. x: A
- el: '#app',
" b9 r' ? b5 a - directives: {# v* S" A% M/ p7 J
- // 注册一个局部的自定义指令 v-focus
- B8 |* G' B5 W$ [( V - focus: {0 E% c Z+ S1 x& K: ]! ?, e1 N6 e
- // 指令的定义/ u8 Q% |0 P0 g2 b6 Y8 }
- inserted: function (el) {! a( o/ X" w. F; Z5 p7 X
- // 聚焦元素. h7 Q8 A7 V, u8 ^: W+ D: d+ u
- el.focus()
. p& F5 o6 q% u% j! \) t9 E- S: N - }# r* Q% b' G* Q/ K
- }+ d2 n. K, k. Q( x1 |
- }
, e6 h3 l/ S+ U2 |7 A - })
2 W% S9 G8 Y9 Q; v - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 + \+ O" z+ T# t F6 ^
钩子函数参数钩子函数的参数有: - 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 ^8 r. x+ L5 L e4 K) O: k% g
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
/ g8 F4 y" a" M% L
以下实例演示了这些参数的使用: 实例
& o0 Q1 x6 s9 _$ T6 Y0 ?, Y& v! |$ l' h1 {0 ~
- <div id="app" v-runoob:hello.a.b="message">
2 c& q% I j' p0 [! Y$ Q - </div>
3 h" S8 B( q& T5 B3 x2 M - ' D! P6 {" Y7 H9 S# Z% _. F
- <script>% `: F6 O6 w# A' u0 N% ]2 ]6 m3 u
- Vue.directive('runoob', {
# S- d' G. M! s7 w+ \! O, u - bind: function (el, binding, vnode) {5 B% B! W! U, P
- var s = JSON.stringify
4 }1 C O: e5 e$ r$ V - el.innerHTML =3 h7 [7 W8 s7 c! o; O8 e( t0 n7 a
- 'name: ' + s(binding.name) + '<br>' +, B% _7 H) [3 E2 @' f
- 'value: ' + s(binding.value) + '<br>' +* B; r' ^7 j. @5 J
- 'expression: ' + s(binding.expression) + '<br>' +! a- d; w1 Q% p' |
- 'argument: ' + s(binding.arg) + '<br>' +
+ |) }+ l9 |6 q, M$ v7 V0 s7 f$ X - 'modifiers: ' + s(binding.modifiers) + '<br>' +( Y4 h& S) c k( y# R
- 'vnode keys: ' + Object.keys(vnode).join(', ')
5 L# ?) a0 f: x8 _* C0 W - }, I0 a% q" f, i
- }) Y9 T5 P0 y4 A
- new Vue({: H) Q" K, |- ]# w
- el: '#app',
3 o; Q7 N( J6 u4 \ - data: {
& ~' @! z1 ?+ L( h3 G+ x - message: '菜鸟教程!'
+ x( P/ I/ H- C - }; q- z% I% l( H+ P
- }) m* Z# q$ r# w
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
7 E- v" e: P4 E2 c* D) W" _# G- Vue.directive('runoob', function (el, binding) {3 b% k1 g7 i1 W Q) I" g% a
- // 设置指令的背景颜色5 T1 v5 _4 y; H; h
- el.style.backgroundColor = binding.value.color# X; u- a- A& v$ y, F5 g
- })
复制代码
0 v$ h+ ~9 h& g" L7 S; d' _0 C F8 w& t0 C+ ?3 f) O! i* Q
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
: @. T8 g8 C4 y$ d& ^7 X1 s m' N+ A% o( b& X! T
- <div id="app">! s! K' W4 g4 W* Q. W
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
: i' k' E$ v0 o( D - </div>2 M9 f" k$ r. D$ l6 f
- / {1 J2 e% ?0 h# L3 V
- <script>
" l- s: P; x) Y - Vue.directive('runoob', function (el, binding) {/ W4 U: m$ M1 ?. F; ]4 P
- // 简写方式设置文本及背景颜色
* R) W- e0 q3 Z2 [+ o - el.innerHTML = binding.value.text
3 i* P: T) |& y' `; j - el.style.backgroundColor = binding.value.color
8 V& Y, W, Z; ?5 S% s8 o& M, ]0 d - })5 {7 k/ v2 T: _" d. O
- new Vue({
{5 Y' E1 { b - el: '#app'
: b9 k+ @2 D- ~ - }). y( C4 s6 h7 c/ u# Y- [
- </script>
复制代码
; B H! O$ J0 K- C5 G/ T
1 X! M6 w5 [5 E6 k' z9 }; ^- a( K% D1 O+ S3 g9 I5 P
|