' i8 f$ E( @: Q B7 f9 j
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例1 I6 {( c/ l$ i+ v- l& ^5 Z) v% A
5 H! n. j2 Z$ x% v% ]8 `/ j
- <div id="app">8 t4 X7 g Y0 o" Z
- <p>页面载入时,input 元素自动获取焦点:</p>3 H9 x: S7 n, M* f3 Q+ z, @' ~1 G
- <input v-focus>. Y4 A3 P" J6 U; s& F( L
- </div>- o8 z3 F8 i0 B
-
7 X I9 N" C' Y* C2 G. n4 c5 b) W - <script>
* j/ |( l) @( j - // 注册一个全局自定义指令 v-focus u l2 i9 R! f# _7 `( M
- Vue.directive('focus', {
6 s' k# E3 z* ? - // 当绑定元素插入到 DOM 中。
; r8 w/ H' Y5 d* |7 X" s7 q& |+ K - inserted: function (el) {
5 B9 _) k8 K8 f - // 聚焦元素- k6 ]3 C$ c# g/ R. A" P
- el.focus()6 r1 N2 Q, v8 w% c( N
- }4 M1 C8 M0 n i" k
- })5 f6 n) @) L2 w$ u8 @( ?
- // 创建根实例
& P7 v) z0 Z9 Y' S0 [3 k! I5 A6 H6 D+ L - new Vue({7 b, Y( [: \# V
- el: '#app'! _, F" O! l y
- })9 [9 ?, Z! a: K% q1 A, E
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例5 I* x/ d2 F: p! a* m- s& w! ]
) Z* T7 A) z2 a( Q! ~- <div id="app">1 P+ E' H% c" y* @
- <p>页面载入时,input 元素自动获取焦点:</p>0 U1 e3 j. H6 \& a* l! v$ ]
- <input v-focus>, o& z( d; Q- q5 ^0 Z- D
- </div>5 C& L3 k( g3 L9 |" B
- 3 ~6 }+ o& F: e) x3 e0 I
- <script>, K ^! L3 M: |0 W6 \* d6 W6 q( Z
- // 创建根实例3 u; B4 P: g! }
- new Vue({
, Z# d, U' k2 Q9 U( k0 w - el: '#app',3 b, s/ |2 C: L `
- directives: {' V- B# k! \" Z
- // 注册一个局部的自定义指令 v-focus1 }* B$ L; h4 |
- focus: {% d5 \3 V1 \9 H* S
- // 指令的定义
3 s* v" X+ W4 u5 I, `) B5 A# H - inserted: function (el) {7 T$ k7 P Y0 r, i
- // 聚焦元素
' F; |: j0 O0 B6 D% ]7 D$ ?! W - el.focus()5 N/ f J: x) d% S
- }
5 H1 F) n5 s( q5 L - }
7 G5 X G. ]9 N3 e$ s- o& s% ] - }
3 H" h: R( A3 Y; ]) x7 Q; G2 f - }): s! `; y) o( m* c" B. b
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
) L+ M% H+ H4 Z' K1 y 钩子函数参数钩子函数的参数有: - 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 }。
1 g& I- G) w2 w& X
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。- C7 m9 N+ ?) D3 k' j
以下实例演示了这些参数的使用: 实例
& H; j. @9 M' V; o. q$ E% C$ O2 V8 W( V9 _. N; }
- <div id="app" v-runoob:hello.a.b="message">/ v9 j$ p" b4 U+ j+ i
- </div>6 Q9 ^+ u& w, _9 \) M
-
2 i, E* A" q7 g4 ]8 m8 U# s$ t9 | - <script>: |7 W* f% ]6 G% V" R
- Vue.directive('runoob', {
" {9 U3 w5 l/ z2 ]# Z3 [" ^ - bind: function (el, binding, vnode) {5 m/ C1 S7 F. k, N
- var s = JSON.stringify
' w( k8 s0 f% U# T: ^ - el.innerHTML =2 _9 n1 P* X! c9 E$ o! }) f
- 'name: ' + s(binding.name) + '<br>' +$ ^0 T) b) G) T3 [7 x5 L
- 'value: ' + s(binding.value) + '<br>' +
# a1 J( D: ^; l$ f8 @8 i* H - 'expression: ' + s(binding.expression) + '<br>' +" F0 h7 p: Q. u) D$ b8 C& h z; v
- 'argument: ' + s(binding.arg) + '<br>' +
( A" M% o' f( c; t9 m; C8 X# f - 'modifiers: ' + s(binding.modifiers) + '<br>' +5 E6 a7 O; J, ?% R
- 'vnode keys: ' + Object.keys(vnode).join(', ')
9 g7 G2 Q, q: b# w" k$ b4 J& h, t - }
0 w2 n1 }4 D4 |1 e# c$ W; ? - })3 n! a, k3 @$ ^; @* `
- new Vue({
* T1 V) l5 I; y1 y. ` - el: '#app',2 R2 i/ Q$ X8 F
- data: {7 I" m4 v5 u5 b! n
- message: '菜鸟教程!'& A/ p" v/ ^2 E$ \, p9 c
- }: @) b" V+ v9 A7 D- f1 Z
- }) S$ Y- ?: f" a8 G; i' R
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
2 B8 I; K. q, q) d: P1 Q! W' ~! ~ P- Vue.directive('runoob', function (el, binding) { l+ _+ n9 Z& O; u
- // 设置指令的背景颜色
# l: O9 S; o- n& \4 G - el.style.backgroundColor = binding.value.color
/ [9 h+ |% Y% ? - })
复制代码
& o4 M& W6 z1 L9 d$ t
/ s M- N9 v# K( [% r& E. m指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例& d' O" z/ O" X" E3 j4 U$ N
1 R) ?% ] g$ x% [
- <div id="app">- u2 R/ f. p7 a0 ?, e
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>$ Q* C7 ? R/ G6 R2 W) A9 O2 W; ]
- </div>$ _2 u/ y, D1 Z& |
- : k6 F2 K; t W( ~% X& F
- <script>" |' Z" w$ \' _& l* M j
- Vue.directive('runoob', function (el, binding) {
! j! T" y% M: x6 M: Y; @$ M - // 简写方式设置文本及背景颜色: r; Q* L/ Y5 R, X" ]
- el.innerHTML = binding.value.text
; i( r- o9 M6 p; M- H, Q$ ^ - el.style.backgroundColor = binding.value.color
% V) O# a) I+ }0 G9 m1 J - })' V; S# |9 i! ~( O$ e
- new Vue({! F. Y, S. W% ?7 |
- el: '#app'; m1 H" \8 _( w* a. @: w5 U
- })/ g$ S9 e# A. L& ^
- </script>
复制代码
9 r. ]- H+ y) l# ~/ u4 O, N* ~% v4 E& _. U4 O* q. B
$ ~. B* J; { U3 P8 q2 i |