9 _5 D I. H4 {# o
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
* S9 j" r6 F+ n
& o$ G: B, a& E1 m& d9 h- <div id="app">
+ D" M* [8 E4 g% i7 P7 S - <p>页面载入时,input 元素自动获取焦点:</p>
4 G3 k; p+ {* \/ [ - <input v-focus>
1 V! d; h# ^* D: F- l - </div>
' x! J7 d7 H, o5 s" M& B. ?2 P B9 i2 p - p; B( p3 x, ?2 v& |
- <script>
$ G* z( w, ~7 a8 C" t/ k - // 注册一个全局自定义指令 v-focus
9 N# f, u6 [9 t- i0 ?. d - Vue.directive('focus', {
# Z4 v2 f) \4 V5 G) c - // 当绑定元素插入到 DOM 中。1 Y( y- D" z" L& E2 ]& I5 A7 e
- inserted: function (el) {
% w# g6 v: D+ v4 a) g$ Q1 X L Y, U9 c - // 聚焦元素
: T9 M Z% a5 n4 G, _ - el.focus()
) ~8 J' U7 [& a) {5 C - }7 F# z& n$ @: Q% e9 v
- })
2 E: j8 h4 @" D: i. C1 L - // 创建根实例
- m3 b4 e& U8 i3 M8 ? - new Vue({
$ u: J9 d; e, I1 e - el: '#app'
# {8 Q2 |0 C9 L1 h - })2 K8 ?" z; \: H# ^
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例0 f* Z- b0 z; |% x, ]4 @7 S4 [
5 M: H3 k/ z5 o z! Y
- <div id="app">! c# b( M2 }4 @) u
- <p>页面载入时,input 元素自动获取焦点:</p>
- x8 k1 a- m+ [2 @% D$ ^1 W - <input v-focus>. Z/ }# r# L, c3 p- d1 r+ R6 l) b
- </div>
% S; J" r W5 w- m- a -
) {. N" A/ [! Q$ m4 h1 c - <script>) j* K7 ^8 d$ P! c# t; p9 I/ F
- // 创建根实例& q1 c8 c- b0 {, Y0 p; d! @7 S I
- new Vue({
2 @# g# r5 M2 S9 V; C1 L - el: '#app',( {/ S( s' W( x
- directives: {
, [0 L1 Z3 y9 N# ^ J - // 注册一个局部的自定义指令 v-focus. {' D) H/ S7 H& T( c
- focus: {
. M2 T- a" R, O1 j9 y: G - // 指令的定义) h3 g; a, l9 u. c
- inserted: function (el) {) G& R2 L6 ?; }+ l2 i, R9 h
- // 聚焦元素
0 V% k! z( I) c$ M - el.focus()
1 E" b* Y3 K( A9 \4 `4 S) Z5 F$ U - }$ r5 d6 q3 w7 s0 u
- }
4 i$ \- L) n( m- P j7 Q8 b - }
; J2 g! a$ P' }9 x/ s8 ?4 C - })6 k$ r, _3 H* |# P. g7 L
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 - ?0 c. A- W2 Q+ I% Z/ b U
钩子函数参数钩子函数的参数有: - 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 }。% s% u/ u& U; j& n2 |7 I Z
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。2 ^6 S/ d. y$ t. y
以下实例演示了这些参数的使用: 实例4 M. Q1 z0 [) ]4 N/ j8 ~7 M" [
9 P C' G! ^' Z3 r+ W. z* |- <div id="app" v-runoob:hello.a.b="message">) ]1 S9 k" O5 f7 a% E
- </div>
: Q" `: s& Z2 Z0 t- s/ L5 a+ o2 Y - ' u# ]1 p X( D
- <script>
9 R0 @ F9 @/ N' B# \ - Vue.directive('runoob', {6 U- a! K/ G# m: ]. u- I, D+ P: z
- bind: function (el, binding, vnode) {6 P V0 N- `8 ]+ @- y& [- C
- var s = JSON.stringify
+ [( ]" @9 i1 @: Y, T# T3 p - el.innerHTML =
( h$ J; b( B4 f* H- F9 A - 'name: ' + s(binding.name) + '<br>' +- Z/ [- V8 e Y( z1 I: D" A9 n& E
- 'value: ' + s(binding.value) + '<br>' +
. m* b9 `; U) D- l: L% U3 y, _ - 'expression: ' + s(binding.expression) + '<br>' +7 v) B; V( d4 \ Q1 A, ~1 G. W
- 'argument: ' + s(binding.arg) + '<br>' +
4 N0 E0 d, U/ [& d3 N: v - 'modifiers: ' + s(binding.modifiers) + '<br>' +
9 `- ^& m8 J/ O4 A2 G) R - 'vnode keys: ' + Object.keys(vnode).join(', ')
5 i9 f4 D, I' N. n. s% n: s. z - }
8 r6 P# w3 x8 j# j6 a - })3 S$ w& A& }) K. P, n$ s. q
- new Vue({
& W, J4 o" s2 K6 i/ V - el: '#app',
$ A' m9 {# h: _* a3 P" B - data: {- r; s4 _" U* g$ T, ?
- message: '菜鸟教程!'
& {( t5 Q# }9 ]6 S" P1 s - }! x5 x) }5 F0 w' V6 Y
- })
3 m a8 r6 H& I0 S - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:: M. [* f: T# l" q* R
- Vue.directive('runoob', function (el, binding) {
, [) N, |0 P. |* \5 k9 Z$ F - // 设置指令的背景颜色
# c0 x* }0 _8 u) h5 S - el.style.backgroundColor = binding.value.color
: C6 L% D9 A0 o- E6 ] - })
复制代码 $ ]! K1 K1 b3 f5 b' i
9 ?+ K8 {2 b% R ] a
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
5 o' I# p2 P9 O+ N- O
* @( _* T4 @& \0 l- <div id="app">' P8 o' o; Z- M( a6 p/ W
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>+ y! ?; Z5 y. y% P' m4 x5 T( I! L
- </div>- r" P7 }( E# w+ h2 K+ t7 ]0 \
- . c0 m: N4 Z( Z' D+ g/ A/ D
- <script>5 }+ ~: s1 Q6 b% q @9 C. L5 f
- Vue.directive('runoob', function (el, binding) {
, F( |# z' D4 W3 h& p. f* { - // 简写方式设置文本及背景颜色 {; d$ p7 z/ d* ?0 [
- el.innerHTML = binding.value.text+ g9 ]8 |. ~+ Y3 h
- el.style.backgroundColor = binding.value.color6 ]8 ~1 g! L, i4 {" a/ z
- })
) k! g2 Z/ J# l6 w! L4 ]% p' G: D* V - new Vue({
4 q" V) R' A; q6 w) o" C; L7 l - el: '#app'
; ]' X+ ^$ ^! c# x7 F1 W - })
% }1 _. E; @" t - </script>
复制代码 / q! I& \ f- r3 O5 [) |( l
- G, E5 X4 l1 W! m3 g% K) v
( I* Q# w% I/ C7 _1 C2 W0 X |