# [6 ^5 q/ f; m$ Q: E除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
4 E* f" h4 Q; H& \7 s- e& L
8 _! k' T0 B8 e& A# \7 ]$ ?- <div id="app">
3 N- B6 D! I9 H - <p>页面载入时,input 元素自动获取焦点:</p>7 G/ v/ |+ ]1 e) q0 X) [3 z, J
- <input v-focus>6 F+ e2 X3 J% d- Z4 B) x
- </div>
A: s2 V& U6 ~& a j7 v0 i - - `* V$ v! v: o4 S" v6 H0 `$ p
- <script>
I+ R8 f- e# L! Y - // 注册一个全局自定义指令 v-focus" t ?& k1 C: h: l# F. f0 r
- Vue.directive('focus', {
) h( Z( h D5 Z5 _$ M - // 当绑定元素插入到 DOM 中。5 L3 P3 x( E3 N7 c2 t
- inserted: function (el) {3 {- F' t0 ~, \0 ~ t4 g
- // 聚焦元素
. K! |' H# p& Z& s - el.focus(). w+ H& }1 \* E5 R) a
- }2 K7 a, d, X4 k O% ?
- }) n$ m1 I5 {' Z$ e! A* W, G
- // 创建根实例* E) _ }6 D$ B1 o& ?
- new Vue({' ^+ f; ^+ m- J
- el: '#app'
* L" U! L: i' I3 H. g0 C/ r - })
5 ], F" g- n& i5 X - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
# t4 B0 P- P8 [; C" S( e) g H" F- C' D+ `3 J/ T* Q
- <div id="app">( r5 }# [% ?. ]/ u
- <p>页面载入时,input 元素自动获取焦点:</p>
# ? k- u( f" F* t& T - <input v-focus>
k$ H: U: u( A' b' D# f$ ^ E - </div>
2 y+ n* a3 ^9 p( e9 o - 3 A: d+ w- H' j( _" X
- <script>
1 g( f6 k5 n# R1 s7 t; @0 G - // 创建根实例
( m+ n% e; W& J6 ~( i& R; V - new Vue({
: i, c+ o7 C; n4 J6 ~ - el: '#app',) F) s9 `2 }- a
- directives: {/ @: G5 e8 ]7 y, {: R
- // 注册一个局部的自定义指令 v-focus
- ]. F o. J, m0 f - focus: {! f* z: G! j- O# J8 o! _
- // 指令的定义
& M& B% d) t+ `1 ^" {1 c - inserted: function (el) {* f6 a8 p* s/ b$ z8 E' T6 ], T
- // 聚焦元素$ V! e: S6 E' |7 A# y* i/ c) I
- el.focus()0 z0 S6 h& u' M! Q h
- }; C/ J" J2 X+ G; C) |% L. v
- }1 Y! s; z* l' X4 j% V. E o
- }! |, {% L0 j+ c, Q" l ~
- })
% m% y% g6 Z" S# v5 s - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 : ~( t. y8 L0 g r- c
钩子函数参数钩子函数的参数有: - 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 }。
6 t/ }0 K& L$ I) B1 X
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。; N2 b8 I z# W, `' x7 J
以下实例演示了这些参数的使用: 实例
2 I5 g/ W j+ h: Y v+ u' o# l7 o* P- y
- <div id="app" v-runoob:hello.a.b="message">2 I5 x- ^6 r) {' V# B. e9 w/ Y3 ]8 u
- </div>
4 `* I3 M6 v/ Y# d- c5 O- O! A - ' Y1 _5 l0 E' q
- <script>1 _# r" d, j/ n) P$ q
- Vue.directive('runoob', {
& M7 i1 \+ m7 b, H - bind: function (el, binding, vnode) {: ~6 B( o S% y( T9 t! `
- var s = JSON.stringify ~1 c- {2 Z0 @. @% g3 }
- el.innerHTML =8 p5 y0 P4 H; ~, N
- 'name: ' + s(binding.name) + '<br>' ++ Q- _' y- K) L# r
- 'value: ' + s(binding.value) + '<br>' +' @9 j# v1 O6 n1 k, A# _1 ?( V
- 'expression: ' + s(binding.expression) + '<br>' +
4 \( O* D; L9 y$ A - 'argument: ' + s(binding.arg) + '<br>' +7 P$ d+ Q9 a, o
- 'modifiers: ' + s(binding.modifiers) + '<br>' +
' `: C: ~& \$ _/ m6 W - 'vnode keys: ' + Object.keys(vnode).join(', ')+ P9 S1 X3 v% x3 a+ q5 r. A
- }
+ z$ @& v2 {9 d: v9 r; S - })
, D' Y1 F7 ^+ A - new Vue({- r; \0 V- D; E& s
- el: '#app',
: u! p2 M4 v: x j( f - data: {& [$ L0 s# ?% P( S) `( [5 h0 X
- message: '菜鸟教程!'
; L2 ^# g2 C0 `% h3 T- E0 p1 g - }( ^6 q4 G; r6 O, @& O
- })
' i2 D. c$ p. p9 g2 ` - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
% {' [/ y0 F. Y7 I( q+ g8 I- Vue.directive('runoob', function (el, binding) {
\" {! I% }4 ]8 X- n, v" ^& z% a - // 设置指令的背景颜色
6 C& l7 v& r" {2 F5 t5 m' Y - el.style.backgroundColor = binding.value.color8 F0 Q9 C7 M- V: w' C2 A
- })
复制代码 ) Z& G2 X1 I+ \
9 E: w( l& ]6 j5 w I9 \
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例 b( _7 ?: O5 \
h1 R6 C d9 c: N( s
- <div id="app">
$ c/ B4 Z8 C* D- c, F* U - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>& l! T! o3 U, u |+ Q3 q' A5 u% e( H
- </div>; X" Q i9 }* B9 m9 y% \+ X, F
-
$ D* A$ H8 c9 V" q( B Y: ~ - <script>- o5 q% l% O: `7 S3 @
- Vue.directive('runoob', function (el, binding) {
0 ]7 U! |! U6 B6 C( P& y - // 简写方式设置文本及背景颜色
) ?: j& z0 P$ x" S - el.innerHTML = binding.value.text7 E* }8 b0 y0 ^
- el.style.backgroundColor = binding.value.color/ T8 U' J6 e5 L. E9 u
- })
3 |) j; ?$ K8 I9 } - new Vue({# V/ t, t$ a% o5 j
- el: '#app'9 W# k0 `: @, ?9 n2 U- k, J: p9 W% }. `
- }) x! ~6 K: e+ V6 W& G8 D8 ^& B; t0 w
- </script>
复制代码 ! j+ g' F- L# X+ U, `" q r/ z
5 d0 _2 s0 `+ d, z8 M/ s; _: [& K( ?3 `/ H9 d- C
|