H5 a8 f5 e6 u& s
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例$ E6 O& R! W0 d- K/ @8 K
, |- l7 n0 |9 X: e4 P+ c1 H
- <div id="app">" \) D+ Y9 {, D
- <p>页面载入时,input 元素自动获取焦点:</p>7 G; ]6 V' [" n
- <input v-focus>& O% H o0 Z6 z' B- L
- </div>7 w B6 O+ `8 B5 p
- 5 C* M# H, |- z4 p& z+ e3 e7 n7 W
- <script>" l9 ?7 i7 L1 \% s/ D z
- // 注册一个全局自定义指令 v-focus
% X; b% ?5 a ^2 C/ L0 p - Vue.directive('focus', { u8 P3 h) y9 i! S$ C
- // 当绑定元素插入到 DOM 中。
# }. J6 ^8 C; a" g c0 F, l - inserted: function (el) {
0 w# h5 D% S9 A, N - // 聚焦元素
) N- ?, L/ h" B* e - el.focus()
. j$ s& y9 U1 k, s l" r3 f4 | - }( M( y) m- i0 g" P7 ]
- })
4 a. E9 s" N4 J5 W9 V - // 创建根实例
, A. s6 H8 S4 t - new Vue({
C0 A- c4 [1 r' Z" m5 H - el: '#app'; P& X+ b# ?0 ?% \0 O( B) H P
- })
. F+ M. B7 Q/ h+ ]2 ~2 x% i( ` - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
$ }) Y$ y- H7 n9 E! U; \5 a' m* e `/ Z" T7 M7 ^
- <div id="app">
& J8 I- U7 r7 C5 c+ D' y - <p>页面载入时,input 元素自动获取焦点:</p> a, k s% D/ ?1 ^1 v: V; z% E
- <input v-focus>9 Y" C' k8 m) n1 ^+ S
- </div>
h; X9 T3 n! g' l2 u) v - 3 M3 Y& d$ c0 p' S( U
- <script>: @1 u7 L( e j" t. @
- // 创建根实例* g: b/ n6 V- n$ K# J. v; u
- new Vue({
2 h* H0 @1 A+ K7 z. ] - el: '#app',
7 j/ J) |9 {: J- V' G1 r - directives: {; F `0 x/ y. E/ J5 N9 \' m! e! d8 e
- // 注册一个局部的自定义指令 v-focus1 @ R7 M: c- u1 P4 _9 a
- focus: {% y2 x" [3 A4 U. k7 s. E# j" i4 o
- // 指令的定义
' w2 z! G% ]; ?+ I1 y - inserted: function (el) {- S' Q! e" m0 v3 |# p
- // 聚焦元素
* Z" Q# O, N, R- ] O - el.focus()6 ^& ~: l) U3 E1 J
- }
- B8 O0 {; d2 k - }# [1 o5 ~$ P+ C: T8 k
- }
8 h$ N# u: @! K5 d1 j - })
9 F% v( v# t8 P( f3 L# i- U: @: E- p - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
; S1 [; ^# r" ~! ?0 ?# y# C, F7 E 钩子函数参数钩子函数的参数有: - 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 }。+ z# g/ z- ~9 A0 I
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
$ z* i9 P7 ^7 o8 I- ?/ r
以下实例演示了这些参数的使用: 实例
2 X% c+ Y* G: A1 \$ x2 w+ v2 y% l9 Q1 d3 E6 p; L
- <div id="app" v-runoob:hello.a.b="message">
: @4 s! j5 S' I% g: X - </div>; [2 l& V. ~, s
-
: J3 [8 ~. M: X l$ N0 L( ~2 q$ l - <script>
+ A1 ]$ r" e+ {4 G) S9 g# z, ~0 I - Vue.directive('runoob', {
! w# o! T6 t, b/ c4 k - bind: function (el, binding, vnode) {2 W* @$ _ G, g' ]
- var s = JSON.stringify* h1 V# Q: b- _ {7 ^2 O1 U
- el.innerHTML =" V# T# \" s: d2 H
- 'name: ' + s(binding.name) + '<br>' +0 c" n. Z' p1 F" ?9 f
- 'value: ' + s(binding.value) + '<br>' +& G7 [1 H3 Q% g
- 'expression: ' + s(binding.expression) + '<br>' +' [& e4 a. u5 _% s8 N. n, S) K
- 'argument: ' + s(binding.arg) + '<br>' +
4 V$ R9 q4 _8 U5 r0 _% z - 'modifiers: ' + s(binding.modifiers) + '<br>' +. l+ @# H- m a, U8 x& X, L/ F! P
- 'vnode keys: ' + Object.keys(vnode).join(', ')" v5 Q2 ?# |) N. q( k7 i3 K! J" `/ [
- }) D, U4 E: w& \5 ?; h
- })7 q0 d; r! j$ k! L% {
- new Vue({
+ Z! N; x9 _) h1 {" e - el: '#app',
5 x" X5 q0 f/ }, ? - data: {9 l6 K* n8 U" D- P
- message: '菜鸟教程!'
( U* N) ^0 Y! B4 l1 \2 _- I) N - } H4 H8 B$ G" R x. r. a6 g
- })5 w/ a. \+ p0 S- t1 C
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:$ N- Z z( r/ \1 }% K# L: R# c' u
- Vue.directive('runoob', function (el, binding) {$ s- S8 X. l2 X9 p* M
- // 设置指令的背景颜色
- G% ]9 X }4 {$ v - el.style.backgroundColor = binding.value.color
8 z1 L6 c ^; Q' k - })
复制代码 1 B1 [( D# P, Z) k6 c" J
$ `) D/ j; h- J1 H6 M
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例5 w$ i9 E# O% D/ R
' T w! r, D* ?; P3 S, z' Q6 V- <div id="app">' T- R( ~2 v* U$ h
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>" d# B5 f) R- v" g: Q2 [: v- j
- </div>- D8 r; v: D5 S
-
6 v& \+ U/ Z; R6 D4 q - <script>" ?8 |# o$ V L: |, S2 e
- Vue.directive('runoob', function (el, binding) {
7 w* K' D: m) \( E5 u - // 简写方式设置文本及背景颜色
8 Z) a8 f% A# g; R - el.innerHTML = binding.value.text
" l! k$ j9 Z @7 P9 b! n( X1 k - el.style.backgroundColor = binding.value.color
! `& q) x! u( T) b - })& N' Y/ r5 t/ B( _7 V
- new Vue({8 h6 H$ l }8 u; A( i! x' r
- el: '#app'
2 }* B. S$ |& y6 T - })& a4 W; e$ q$ `2 @& `3 y: b/ ~
- </script>
复制代码 : p( g- I x" |1 a; \3 i ^
' v& \- g" I# J$ r+ U" H# k% l6 w" k' Q6 K% w
|