9 T% {8 Q+ D2 k9 m: N* b% x除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例5 G% M* b1 l; P$ w; e
" x7 _: Z" |. s8 ]4 ~- J
- <div id="app">% x/ k3 J, R4 ?& X& ?
- <p>页面载入时,input 元素自动获取焦点:</p>! \4 E2 d2 ]! p' Q* L( x! R
- <input v-focus>; Z9 U. C: G+ G! [# f! h
- </div>
0 u! t- p$ l$ Z( l* d8 b# D -
9 w) ~4 u* U% `0 R1 F - <script>
# d* y( y. d, W7 r& E - // 注册一个全局自定义指令 v-focus/ [+ Q) h' @/ a. Z8 B* A
- Vue.directive('focus', {
1 |0 O/ f0 H. `6 C8 i6 g9 e - // 当绑定元素插入到 DOM 中。
' x/ Y1 @5 O6 |9 L - inserted: function (el) {
$ K! q- [. n. ]& c8 Q, C! d - // 聚焦元素8 s, V7 b2 z, r+ ^2 B0 |: P
- el.focus()$ _) h! j" q! @( o( S$ z# @
- }, N8 A0 u6 d0 J
- })- U3 n" H' s, Q4 V- g
- // 创建根实例
7 Y. H* _4 j% d - new Vue({% F r/ ?8 X2 n- Z
- el: '#app'& b. T- B1 b! H7 Q6 E) R6 M4 Z/ i0 O9 t
- }) a- `: _: i$ @0 M" Q* }, Z6 y
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
) r' |! M* j% h- @. \' S! Z; k7 W1 ]9 `, T
- <div id="app"> O$ |4 _: U4 a7 h- l4 x( N
- <p>页面载入时,input 元素自动获取焦点:</p>
# v8 }& J, D4 J$ C - <input v-focus>/ a# ]0 R8 Z1 R3 J1 p/ A% k
- </div>
, h: m2 e. P3 E$ H - ( r. A0 V! q( ~- S8 X1 u
- <script>
5 L1 y# C Y$ h- b! t" h - // 创建根实例! C h! C. \) z) N8 g# A
- new Vue({& D& j6 j3 x7 K& j1 ~) O
- el: '#app',6 C1 O8 _8 Y) o: m6 R2 L, c6 y
- directives: {
8 T) S, l8 }! K# g - // 注册一个局部的自定义指令 v-focus
" F' E$ v7 k6 |# ~# H - focus: {
8 {) p- j) Q8 v0 C - // 指令的定义
3 N8 r# b- O) G- t3 s) U - inserted: function (el) {
/ I9 e/ d3 F% ] j - // 聚焦元素
' z& D7 B) X. B3 D - el.focus(). j: Z8 ?4 z- E7 _* W5 r: h; Z
- }
' ]- r. F3 C4 a6 u! t - }
* s" n8 f$ O/ q9 Q0 k4 Q - }
6 ?# ]/ v% g) T' r8 A! S0 R& c - }), W( C0 H- Y2 [: q/ g
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
0 H) w) L5 _: j! z2 i 钩子函数参数钩子函数的参数有: - 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 }。% P. X& Y, O' ?! @1 h0 C, @
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。5 b: w5 d8 A$ J. l9 r: i# _+ ^$ Z
以下实例演示了这些参数的使用: 实例
. T" J/ A! u- a: B; p/ e- U; d# f9 B' J9 a5 @- H
- <div id="app" v-runoob:hello.a.b="message">
& A3 o/ q7 w; A2 b/ p& A# A' g0 c - </div>
3 l: G9 I' g5 o" i - : R# k7 z# n8 [
- <script>
# I% e1 ?6 m1 x( r5 S - Vue.directive('runoob', {
' l* Y2 a( f) s - bind: function (el, binding, vnode) {
. K4 r; k/ X3 D$ [$ c4 ~* s - var s = JSON.stringify$ P, l/ L+ [+ B- y
- el.innerHTML =
) ?5 W1 l! p7 ?% U* T. M' I - 'name: ' + s(binding.name) + '<br>' +6 l7 f9 ^- E6 M% Q
- 'value: ' + s(binding.value) + '<br>' +
2 h0 h1 o8 Y1 j! g8 ?/ j+ @% H - 'expression: ' + s(binding.expression) + '<br>' +$ f( H* n6 p" C
- 'argument: ' + s(binding.arg) + '<br>' +* A4 D1 M# l) l9 d8 `
- 'modifiers: ' + s(binding.modifiers) + '<br>' +; E/ F( e+ F2 W
- 'vnode keys: ' + Object.keys(vnode).join(', ')
& I5 q7 I4 i$ N" t4 H# u( V6 ` - }/ m. C) }; L( u
- })& ]; f7 m! g# w8 Z+ D( G% `
- new Vue({
$ `8 ^; a7 ]: {) P H! K, |4 a0 i - el: '#app',
: d5 J( F3 n" j% |6 P - data: {2 h2 O4 }( L4 e' s% V. X1 _8 ^ C+ v
- message: '菜鸟教程!'
" g& U/ L& U1 X5 h$ j q9 S# u5 o$ V - }7 o w: v# D/ g7 {
- })
# r) @# S- F4 B1 Z. L9 t0 G - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
( P) C% ~) h" i) M1 G- Vue.directive('runoob', function (el, binding) {6 U X7 V [8 W" w2 @/ J
- // 设置指令的背景颜色
0 z2 P$ m$ p7 s9 U9 m) H - el.style.backgroundColor = binding.value.color5 [9 A4 o8 F0 ~' h, X7 n
- })
复制代码
: B2 o' |9 j. \) p2 ]( l# x& x9 v9 W# ]; x) e0 `* U( x
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
* ~! L" {/ l0 j* p+ y( Y2 Z; W* a; i4 a9 M- i% Z
- <div id="app">; c2 i8 Y& E7 R. \2 }' z8 R
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>. k+ B+ U+ P" B* M) [4 `6 E$ U
- </div>. c& t0 d. F& w! p/ |' _0 r. Q
-
% s3 q+ G& l1 F/ f& F; ^/ w - <script>. [( `2 R) H: E( S [6 Z3 f
- Vue.directive('runoob', function (el, binding) {
: s9 V) `# w5 N! ^ - // 简写方式设置文本及背景颜色
9 w5 o& ~7 k6 `9 q* Q3 Z5 s - el.innerHTML = binding.value.text
8 H& k: l- M4 J9 X- H' u3 I+ M0 S - el.style.backgroundColor = binding.value.color5 z+ e4 [: d* ?& [# _
- })1 M6 \1 J% l. F7 M* F% n7 h% v
- new Vue({4 n4 d& ?8 ?% ?1 K/ J
- el: '#app'9 O& h2 f( C- ?5 ]
- })
* J; M1 F+ ]+ }: _4 {0 k+ P - </script>
复制代码
* d1 a7 j3 r! F+ }0 [( K
% m; O! W3 B# ?" ]
- M0 Y: C% F% Y2 Y$ j6 b |