0 T1 N0 Z4 W+ c) z# R- M7 I$ N
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例" n1 V: y* J: w1 g
# C! W5 b0 u2 n3 S! A
- <div id="app">
2 i$ v7 |) h, b2 s0 U4 P - <p>页面载入时,input 元素自动获取焦点:</p>
) k# l. @2 a& a% O& e& ^ - <input v-focus>1 T4 g7 h1 h* m# O" B8 l4 R9 a4 Y
- </div>, N) I/ C. w% {( H# V
-
0 s0 ]5 x1 s5 @0 K, X- s - <script>5 I6 Y: q& m( L, X4 `
- // 注册一个全局自定义指令 v-focus0 F) Y1 T1 o" m5 J* m7 s' {& s
- Vue.directive('focus', {
) c. [, J5 @: W+ T% B- H; B - // 当绑定元素插入到 DOM 中。
z$ u( _+ H, d5 g. c% ], A - inserted: function (el) {0 d9 s' D: |; N$ L2 ^" @
- // 聚焦元素1 D8 J/ P+ t/ I5 q1 }
- el.focus()# |$ V" ^: J- i4 X8 ]
- }% A; S4 r9 I) n- P! ]( E' d1 v* @
- })$ e9 Y* V2 t+ x2 {1 O+ c2 O' y
- // 创建根实例
4 ?" L) s1 _. j# q. w" r# h - new Vue({
8 n9 N4 L5 \) J$ Z - el: '#app'2 |, r1 C) r2 {8 z2 r7 ]
- })/ P ]! J g; `. q8 {. r4 Z0 k7 S ~$ w
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例( z3 n% m. \/ h7 k! j4 O( y+ r
# J. q! @0 L. t( y. ?5 a4 ~. _+ j
- <div id="app">) x6 `) t- J" \3 M4 ^; X& f9 |
- <p>页面载入时,input 元素自动获取焦点:</p>
3 u& R% n, @! I% _9 H y8 { - <input v-focus>0 p0 u% D, H( }( O7 ~
- </div>6 P) h5 U0 G# @
-
7 ~+ H( A: g/ Q* H8 P - <script>9 t. H7 }! @ Q6 d5 y" G# ]4 q
- // 创建根实例7 z' `# U2 o( ~# j- _8 f
- new Vue({
N# L; d! D0 Y( O5 Z; s0 s - el: '#app',
5 b. _ p, G6 a4 K3 |0 l: r - directives: {
) P+ d& a* O" F }/ u- m* I - // 注册一个局部的自定义指令 v-focus
! D, h# O. v X9 A4 E1 z$ R - focus: {
' z) P3 W7 V5 e+ v! A# I - // 指令的定义
$ B% O2 ~$ Z& | - inserted: function (el) {
" _7 \$ g! d1 e: f- w$ t - // 聚焦元素; t( t3 S0 t; q) l9 L1 z
- el.focus()# L- b2 B- c } J
- }
: j z k% Y& o! z7 }3 r - }
2 Y0 O) C4 z* _2 L2 W - }
) G; n4 \$ R: I/ f8 e5 Z. c. W - }) d0 z$ K! [. {8 z
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 $ y% R9 _# `: H7 z
钩子函数参数钩子函数的参数有: - 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 }。# N0 s- T Z# s9 _0 f! [
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
: P, ~7 U1 ^- D! B( ]
以下实例演示了这些参数的使用: 实例4 ?! x& V9 I: e4 k
6 j7 w( d+ u G& ^; Z, @- <div id="app" v-runoob:hello.a.b="message">. w/ s7 n. b5 o" S$ \
- </div>
0 e8 O5 S+ s0 M; ^+ O. N3 h, y$ x -
4 z* ?' }1 @2 B - <script>
& l* _) r) ?# \# L - Vue.directive('runoob', {
% O* n+ f5 q/ q - bind: function (el, binding, vnode) {& }& M1 H' }8 c( E' X7 C( i
- var s = JSON.stringify/ Q g& L1 j! M/ m" T
- el.innerHTML =& G5 i5 V2 ?8 U4 p$ _
- 'name: ' + s(binding.name) + '<br>' +7 q. r9 x0 Q! d
- 'value: ' + s(binding.value) + '<br>' +. x2 f- a3 L( S! Q- S
- 'expression: ' + s(binding.expression) + '<br>' +3 w; p7 i& ~* }
- 'argument: ' + s(binding.arg) + '<br>' +; o. F2 l- H! E- D, M H
- 'modifiers: ' + s(binding.modifiers) + '<br>' +
) E; q" F" f0 Y8 F8 B5 G' J" y - 'vnode keys: ' + Object.keys(vnode).join(', ')# i! C3 _7 F# h6 D9 U ?
- }
/ i1 w8 h- T0 t% a - })
0 M. R1 x2 |; B i7 x+ M - new Vue({
( L$ }; D% ^3 [% O - el: '#app',
& x" e& w1 ?, _1 @( l - data: {5 k4 K& |; }1 x- y- y, i' w! |5 N
- message: '菜鸟教程!'
' F' v: V; S) l% D! Q" Q - }
4 m |, b' r& O# c$ h l - })
2 C1 C( y5 T9 z& ^2 R4 R - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:9 d9 T( {4 ^$ t0 m! a4 y$ y
- Vue.directive('runoob', function (el, binding) {! c2 W' A3 o6 s+ i" `/ N
- // 设置指令的背景颜色
( {# }8 L; m. o4 f* J! I& C9 @ - el.style.backgroundColor = binding.value.color
5 u0 a6 l6 ^" b* p6 B9 y - })
复制代码 8 F% G/ @3 O8 g/ u2 p
N& O" z' a4 K) Z
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
- g* P( ^' ?7 r* G* q' D% M
. S' _1 r+ Q4 ]6 x- <div id="app">" l6 z) o' ~" Q7 ]- M+ y
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>8 X, Z$ f$ ~9 y' H8 N+ x3 k# W
- </div>5 u% {5 W, O2 p3 c% E8 s
-
9 E5 s' F1 a2 y7 Q! p - <script># I/ j4 O" \* m. E, A. s7 Y* s
- Vue.directive('runoob', function (el, binding) {
7 l# }- E U2 ]$ u: U" D& ` - // 简写方式设置文本及背景颜色
- f% x# a1 @6 n; m$ ?( X% g; R# k - el.innerHTML = binding.value.text
9 \. P6 q: S/ k8 P' q* X4 Z; v4 N - el.style.backgroundColor = binding.value.color# r: U- M/ t2 r* w5 h3 `* q& Z
- })+ g. Y1 i+ K/ [% V! x
- new Vue({
" G* p1 H# `1 s0 z2 Q+ i' U - el: '#app'
8 B$ {* E; y9 P5 \8 T& m4 |/ `! P - })" d3 s: Q1 W- {) Z M) m- N; {3 F0 c
- </script>
复制代码
8 c; o/ e Q# P6 l" W t. D# _* R7 N1 v2 @
1 z7 W2 `, e1 J7 g* E: X |