8 q5 r0 @3 N$ j除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
" ?4 V; F) }# v* y
3 a) s c2 K9 x3 {7 m1 }: ~- <div id="app">& m, M# u! b& T( k
- <p>页面载入时,input 元素自动获取焦点:</p>* U- N7 C3 y- c: C" V$ X/ q a6 @
- <input v-focus>, Z; }! t/ l, @( S
- </div>
6 u Q* t- L3 H8 b: u0 r -
6 s" D/ k9 O9 _) }& Q- b3 a - <script>) n; V! E; c# p8 }3 F" s e
- // 注册一个全局自定义指令 v-focus* h$ ~: n# ^6 a$ A3 Z5 V
- Vue.directive('focus', {
- U% g2 K: g+ W$ a7 I - // 当绑定元素插入到 DOM 中。9 u1 c6 I! B8 z0 V) f: i
- inserted: function (el) {
/ v9 Y7 m% b0 @8 d- H, Z - // 聚焦元素 ]8 b5 i: R; F% J
- el.focus()
o; M, d, C9 F2 p3 G1 Q - }: i8 f2 Q- x5 a' e) T5 A } H
- })
1 a& @5 ?. H0 R7 u F - // 创建根实例 A( V2 [- \% |4 \5 l' b+ s& w: d
- new Vue({9 D& F' a2 @! U
- el: '#app'
' |# X+ ]1 ~) S+ V- B/ i# M - })
8 {& I2 G& e/ I0 S8 M' @7 F - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
! ^7 n; g8 V9 @8 M' i/ |8 R9 B5 J: e9 } i% h
- <div id="app">
% h( D/ n' i) m3 C- z X. T; o - <p>页面载入时,input 元素自动获取焦点:</p>$ I7 F7 W/ o1 x$ o2 ?+ q+ R$ D
- <input v-focus>
: W$ Q1 n: i3 F# i* u: X3 Q$ M - </div>
i: u, u4 Q1 w: n2 O -
% P$ m3 O0 u$ p$ y% b - <script>" h4 g" b* o- \& I/ h7 V8 l s
- // 创建根实例
- e3 x7 ?7 }# R& `2 q0 F( X# M - new Vue({- O* h5 m! T* D1 z
- el: '#app',
. T2 n4 Z! N% { - directives: {
8 a; i4 \0 ~( l7 C - // 注册一个局部的自定义指令 v-focus
0 f+ _6 p( ~0 v7 f& v/ l - focus: {& w' F# x4 R2 [' w
- // 指令的定义, _, [; W% W# r* m
- inserted: function (el) {9 ^. Z) Q( u$ {6 }( g9 A
- // 聚焦元素
4 f. R. ]: v. L; T/ [ Y - el.focus()
0 {) _ p! Y6 ~$ D4 f - }
" H* s( _1 m k7 `' ^1 e - }
v9 v" q+ h1 Q4 k" O4 r - }
+ y$ Y C0 j: @9 C - })
, i) ?0 Y- i4 h9 k - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
2 {/ |! f6 |: ^2 D" K 钩子函数参数钩子函数的参数有: - 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 }。/ l6 p i* W7 ]# ?* G; P
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
2 \) X8 z6 ?- ?" R! H7 z7 _
以下实例演示了这些参数的使用: 实例8 P5 t1 m1 Q" ^. z1 v/ K
& B8 p8 Q# }$ ]7 K$ D- <div id="app" v-runoob:hello.a.b="message">
( T/ P% o- w* @& W& X: k6 A - </div>
9 W& d; W: ^* [ - - l* E/ r. |9 d% [4 X
- <script>
7 v# b, K' g. V' R+ Q - Vue.directive('runoob', {
) x2 p* U+ v" q: g, _ - bind: function (el, binding, vnode) {
, ~. _& Q/ S1 O - var s = JSON.stringify
/ c0 P( M, }4 L, I5 x - el.innerHTML =
( J* q1 k# w7 T% C: ?% f( D - 'name: ' + s(binding.name) + '<br>' +
: v0 z- _# t7 B7 F+ ~" } - 'value: ' + s(binding.value) + '<br>' +, b; d. S# [) b5 B @+ U( w
- 'expression: ' + s(binding.expression) + '<br>' +
7 C3 `) P' T6 j% X" Y1 h - 'argument: ' + s(binding.arg) + '<br>' +
6 ~ _. _$ s# J9 n( |1 q& q0 H2 p7 u - 'modifiers: ' + s(binding.modifiers) + '<br>' +# ~: w! x! i* |+ [6 l5 d
- 'vnode keys: ' + Object.keys(vnode).join(', ')
6 N( V8 u) y% g" Z7 _ - }
3 ^+ y. V# P, G% s' Y - }) ]9 c8 I6 P: ]: c: {) j
- new Vue({
$ z8 t' W7 l! J - el: '#app',
i9 r) T; k+ X6 [ - data: {
9 }" t% P" O, {% }) {5 @# t - message: '菜鸟教程!'6 \' ?( J, _3 \2 L ]' q1 I) J
- }
! g% l" ?" g3 m8 Y - })
) D' H- a+ q7 a. u; o. e- L - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
; _6 I7 J+ a0 L2 I: U- Vue.directive('runoob', function (el, binding) {* L3 Y# b: \3 x" x
- // 设置指令的背景颜色
( `5 i: m7 G: X3 V( P) ?! m4 { - el.style.backgroundColor = binding.value.color0 z! z: w8 r* Q, f
- })
复制代码 & a9 u1 x, G2 T6 b
, ]9 e1 K0 e r; k9 X9 }( f1 H! s) J
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例0 ~/ L8 g w* d& x1 ~
9 R6 @6 s" P+ Y/ D# b" `- W* R
- <div id="app">
6 P9 ~6 [/ B$ W* d* Z: s - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div># x) l8 w5 ]1 W9 \; Q
- </div>
/ |* ^) W) O* E. Q+ G1 G -
( F9 H* u5 B `* q8 M - <script>
5 D9 M! p+ e0 d5 m- ] - Vue.directive('runoob', function (el, binding) {1 i6 _4 N- n7 a' `/ L8 F
- // 简写方式设置文本及背景颜色9 K6 z- s+ L3 I* D1 z
- el.innerHTML = binding.value.text
8 ? j+ W# J& N- B/ z* t - el.style.backgroundColor = binding.value.color
& Q: J, s; H$ t; M- A6 X- p - })
' F" k8 U, p$ T* V |% ]1 D - new Vue({
: |" N1 Z S+ ?( l7 e) ~ - el: '#app'
5 o3 v- O5 R% e" i ~ - })- q% A# D( F, R1 ~" m* v' ~
- </script>
复制代码 & A) r0 I0 [* Q; c& U6 w
7 C% y) \6 y" t' n
4 W+ D. Q1 @. d% f) j" _ E |