; u G" r/ H) m n) ^除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
4 A9 N0 c/ ?1 i5 {
* y6 }; [8 m$ |8 f1 F; @- <div id="app">4 F0 q6 }0 Q8 A6 j- T. N
- <p>页面载入时,input 元素自动获取焦点:</p>1 @ }: M" b- k, e+ ]; T" X ]3 [
- <input v-focus>
: `0 \9 k9 R( P T- J - </div>
" Z. t1 J5 h# t -
0 a8 d* W. M7 Y - <script>
6 V0 _- \- M6 n6 ? - // 注册一个全局自定义指令 v-focus7 N1 Z3 ^' {, j
- Vue.directive('focus', {
A6 {, e0 F5 y3 O - // 当绑定元素插入到 DOM 中。* U% M9 M* I- _4 B0 y }3 Y
- inserted: function (el) {
5 P' M2 [0 t9 @ - // 聚焦元素
5 x0 r5 S) b+ b$ H' |. D, ~/ `" _3 f, b' X - el.focus()1 J3 {& P9 y/ o$ R4 ?3 A* i2 [
- }
" J5 r. t+ M. I8 @7 \' Y' S. C' u c - })" u9 P! M$ l* P8 z" o2 i! z, \
- // 创建根实例$ s) A9 s6 l6 Q: {" ~& i
- new Vue({
9 {5 M0 e8 I x0 [! V ? - el: '#app'2 N9 K+ T" A. A' Y
- })
) g' v I3 l* r$ v0 n - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例9 ~9 c8 w5 y7 B3 D
" f! F O) v l& @. p1 f- m: M
- <div id="app">* m1 T% Y; O/ e4 d1 A
- <p>页面载入时,input 元素自动获取焦点:</p>
l6 U" d/ z) c - <input v-focus>* P4 F" ~; B; E( ^
- </div>
$ o; l$ V: C7 @; o - . [8 x: F0 ~5 n8 h I# i4 B% e
- <script>
6 T( ]3 L0 \7 [4 p - // 创建根实例 x* p, f# |: m, @
- new Vue({
$ t/ N8 M0 _& h" k+ } - el: '#app',8 v3 ]2 d# x$ n: ] S( ^( C) A7 R
- directives: {/ \, C# p, I9 ~% O! c
- // 注册一个局部的自定义指令 v-focus
6 Z& T. [& n' ] - focus: {* Q9 A* U# s% k9 \& z+ I
- // 指令的定义
" A( ~8 E. o, K8 O6 G - inserted: function (el) {8 Z( a* Q4 `3 R
- // 聚焦元素
" S2 ^- N' K, N2 a% V7 `6 p! z - el.focus()
% q# ^$ c, o. ]5 u7 @ - }
8 {! n4 l6 L( s' h9 W - }# h, g2 R, |% S1 B" J
- }) N1 M$ B" X) z7 U
- }); A9 X) x/ T0 m" U5 _% M
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 7 }) q1 L, o+ ?1 N9 j& E9 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 }。
, }2 `9 @9 d! Z; t
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。3 H' @- u& v, l$ I h$ s
以下实例演示了这些参数的使用: 实例" \2 E$ A7 x8 g8 b/ @
$ M1 s2 I0 h3 N- <div id="app" v-runoob:hello.a.b="message">2 y6 {# r) q8 f) q3 ?$ X
- </div>
4 ?2 _/ v8 z7 O) c5 T! C1 n -
) e, V7 d+ L4 T: r1 J - <script>
6 t5 p% ]& q% k7 ` - Vue.directive('runoob', {
! E) u: a, c+ N/ F! T( ?' B - bind: function (el, binding, vnode) {# K/ p6 {6 r1 o1 k- s N
- var s = JSON.stringify( M" q& ^8 S2 i, I$ Q0 a
- el.innerHTML =! C6 S+ A9 M" [# v; \' Y) K
- 'name: ' + s(binding.name) + '<br>' +& j5 g9 E8 G4 ]! k5 S. c! }
- 'value: ' + s(binding.value) + '<br>' +
" j6 v/ C2 ~' l: L" G8 n - 'expression: ' + s(binding.expression) + '<br>' +4 ~4 b& X* R* \9 e
- 'argument: ' + s(binding.arg) + '<br>' +2 Z1 \2 n9 f- I, h5 \* F8 w* O
- 'modifiers: ' + s(binding.modifiers) + '<br>' +
$ U: N0 ^/ c9 v7 q X - 'vnode keys: ' + Object.keys(vnode).join(', ')
0 o6 I% P: ]; b2 c1 c0 u- z4 C - }' ]0 }, F& h. z3 C O$ O; x# B9 e
- })3 t- n$ P* g' G% c( `" Y1 |. V
- new Vue({
3 W, ?0 P8 b, `0 s; E" Q - el: '#app',
) Q2 Z7 d! r( _9 @+ z; c - data: {
0 c! K+ K/ ?, |& H* W: v - message: '菜鸟教程!'
. \, W( `; a6 F2 L' s! R - }$ [6 A4 ]! \8 b8 T5 z# T
- })7 E; {- ]- D. A9 L! k9 e
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:" u4 I4 V7 l* M9 E1 z% x2 C+ p
- Vue.directive('runoob', function (el, binding) {! E ^, ^' b" S7 N' S
- // 设置指令的背景颜色
3 W# L5 W4 Y- N% {. q' ~ - el.style.backgroundColor = binding.value.color* i0 ^2 k4 A; @' i2 Q; m
- })
复制代码 % c: c* [' H/ E' n
2 q4 T' F7 b" u7 O
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
" p# I: @7 W$ D" b8 `; e& N; M( N3 c {( H* M% ^0 I4 {
- <div id="app">
' b5 @6 _; Q* L5 _% A, ^ - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>: m: y% v8 y% p% u5 \6 C
- </div>
# s- ]- d% {1 f" k2 d0 j% I -
* W3 D6 J5 G% D& D - <script>
( J8 B" G7 V/ I: G6 h - Vue.directive('runoob', function (el, binding) {5 k; w% c; y/ B6 |9 r" W* A: J7 ^
- // 简写方式设置文本及背景颜色+ O6 Z' r, {. y$ S8 |1 d
- el.innerHTML = binding.value.text
) a5 z0 O6 i2 X* W! |! B - el.style.backgroundColor = binding.value.color
6 D8 k: d% {' M. e0 S - })
1 E! F) n, a* k7 c - new Vue({
' w" P) ]0 R" ~- ?! Z - el: '#app'
5 Q2 n1 x+ ~6 ?, @3 _& f3 p7 U# M - })
: Y! t) h7 Z7 S: M3 \ - </script>
复制代码
# I9 s! o1 D2 J- V4 a" O$ u( @4 \0 k/ t( `# Q, }. C4 X8 r1 x
# j/ s2 S' c3 u# k" w: Y) P
|