1 | R4 l: S+ [5 y" y除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
$ }$ V7 m7 W) D( P+ W) u
- ]$ H1 ~) \5 G4 r- <div id="app">
! p" R- D T& F6 J/ W- }+ n9 C Q - <p>页面载入时,input 元素自动获取焦点:</p>6 [2 s$ O$ u5 K$ ?8 s* R8 V
- <input v-focus> {' }2 R, _; b* F: x
- </div>
2 H: G" n# ?# f -
6 w& G! S- v) q. m' o" b - <script>- E2 u6 B- O+ A) N/ r
- // 注册一个全局自定义指令 v-focus
; ?# U1 X# H+ w( h/ A - Vue.directive('focus', {
/ a. q4 f) z% o0 p - // 当绑定元素插入到 DOM 中。
0 }5 e; E; q$ Y5 {7 e - inserted: function (el) {7 i# s: o6 r( c% Y3 s7 V
- // 聚焦元素
! x; W3 |& P% F) q, R. d$ o, }" V - el.focus()
9 D( w( l9 J6 A. k( Y - }8 @& e+ t# \7 h3 M( i4 @
- })
$ i V# p. j" L- S& P& G - // 创建根实例+ G% p! L9 w% e% j# Y7 w8 E
- new Vue({% _0 ?4 }9 T+ @, x4 \5 _) H
- el: '#app'
: G: r) u- A8 c. E4 J. G - })* k: C0 |9 H, u' b8 ~$ a
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例6 |9 M/ @0 d& ?7 I+ z# X' S2 n
7 \2 [1 T$ X& p m* a7 K- B/ ^" c
- <div id="app">
8 L, k. X& F7 E/ l/ {9 K" a - <p>页面载入时,input 元素自动获取焦点:</p>
4 Y" l, n4 ^" U- C5 T4 ~ - <input v-focus>
$ I, G6 F& C( C - </div>6 P D* R( _: s8 I$ R5 o
- % N8 w6 q3 D* Y' T, V; l! p" y p
- <script>
* B, R6 [4 e! E z: a, S - // 创建根实例
* [. W1 ^/ ?1 h( z6 Z% ? - new Vue({
6 `% A U2 i4 g$ e7 R" ^ - el: '#app',
& s, O1 ?, H9 G* f: s" G; F - directives: {
) C: @9 k: P o - // 注册一个局部的自定义指令 v-focus y% z5 D6 J# F, {
- focus: {& b9 V7 n% }$ w$ Y9 F9 C
- // 指令的定义
; j( \+ E0 a1 O' P; a* R$ P: F - inserted: function (el) {
* P1 [" Q& a% {5 d ~. _ - // 聚焦元素( I6 b; S8 ~. C {9 X5 q- U0 ~) y4 C
- el.focus()7 z6 w( p0 O: S; q& h* a1 o* I
- }, ~+ L* G( e; |0 R7 C& ]! S
- }8 ?( P- u5 j! B
- }+ i! _7 Y2 b; p. w9 h$ {( I
- })
; f; Q+ X% Y2 n# V) j- _, p" G - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 " C7 [- N, w8 i9 O- z* R! p
钩子函数参数钩子函数的参数有: - 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 }。! D5 T* `- k9 D5 t8 g3 D9 a
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。& X/ U6 A' q. _1 p" j+ L1 O$ g
以下实例演示了这些参数的使用: 实例9 ?( |0 g& Q( {1 S) Q2 x
: C$ I1 L2 E$ E" S1 Q- <div id="app" v-runoob:hello.a.b="message">7 `, R2 [! e! Y5 z9 D
- </div>
( g- O X. \6 |; L -
$ o- m+ I; x2 D! U" t - <script>' I$ S, s. g( b- f z/ Z$ x, Y
- Vue.directive('runoob', {; k' O6 v2 Z5 f! u
- bind: function (el, binding, vnode) {
# X$ ^7 k- i* k1 q- W - var s = JSON.stringify
; R9 Y5 U1 o$ J5 u h0 i& C$ s. { - el.innerHTML =
9 N$ z! B3 P S4 G& s - 'name: ' + s(binding.name) + '<br>' +
- i$ K% A X1 I - 'value: ' + s(binding.value) + '<br>' +- K) N$ g9 G! v8 W, K6 B
- 'expression: ' + s(binding.expression) + '<br>' +
: d3 X7 d1 \# X u - 'argument: ' + s(binding.arg) + '<br>' +4 f+ h9 h/ W/ i( w, ]
- 'modifiers: ' + s(binding.modifiers) + '<br>' +6 i" r1 P8 T! t& b6 p9 q
- 'vnode keys: ' + Object.keys(vnode).join(', ')
/ z% F" p; q! L; Z - }0 R- B% o" k1 @, m
- })3 n8 m" Q. u( C; R
- new Vue({+ d6 m3 p! z% e8 ]7 ?5 L- H
- el: '#app',
- B- G+ H5 }8 c5 `4 R: A8 m - data: {
0 h+ A* ~: l9 O - message: '菜鸟教程!'
1 Z- V. p2 v- ~ - }
% ~# r7 U* k3 Z2 I8 X! e- f - })6 k- Z% f, p* G z/ g$ B
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:9 B, x7 F9 }) S) d
- Vue.directive('runoob', function (el, binding) {
7 @! Q" e3 Z- ?( O' g7 P - // 设置指令的背景颜色
1 _$ `& |4 J9 J. D - el.style.backgroundColor = binding.value.color
) ]. G: ~! Z. x b3 l2 y: S& O - })
复制代码
. u$ i" g6 R- S' j/ |
+ B) x. c ~0 Y5 K x$ C5 i指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
; ^' K7 v0 k8 }' O3 A5 X# m0 H4 B$ d: ?% S: E5 Y U
- <div id="app">
4 a- }4 ?2 ^, g0 R9 y' q y# y+ s/ G - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
/ F' f% m! g% M# z7 s F - </div>
\! r! H- g3 {% G: d/ G! ]/ g - 1 {9 D; f+ z- }. k" X- h
- <script>
) N0 \/ r5 r+ H2 J. n! j - Vue.directive('runoob', function (el, binding) {7 \7 [. a0 M0 p2 [
- // 简写方式设置文本及背景颜色
! I" Y2 j% N- O& w/ e3 ] |1 }6 I: z - el.innerHTML = binding.value.text
5 F3 `! Z, M6 q w9 F - el.style.backgroundColor = binding.value.color# m: Y# l( l/ D8 f
- })
! Y* |8 u$ ], {$ z1 I. B: d2 ~2 T - new Vue({
( {! N# U+ G q) V( { - el: '#app'
* {5 m. E% R* k# Z2 R - })
' g+ W8 R- L& o! Z6 Y6 q - </script>
复制代码
7 z) O. `4 `4 f+ E# |& w8 s9 G# I8 C! d
' y6 A* ?) N! K' B1 { |