5 P1 R* f& Y, S$ A- ~, ?
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例& O; @1 U% G5 }6 V3 ^
1 T1 v- W5 j& ]0 V. ?- <div id="app"># u$ ] d9 s& u/ Q: [2 O
- <p>页面载入时,input 元素自动获取焦点:</p>1 n' l- h" y$ L/ h, r! C' L& K# C O
- <input v-focus>
' O9 Z/ o# O/ O0 E7 [) D+ S+ C - </div>
* D' ^# U% R7 }2 o8 O -
1 L) O* u+ k) t6 Y" j - <script>
3 p' |6 A3 X! `8 O! Z" Y - // 注册一个全局自定义指令 v-focus
! ~2 i ~, P; B5 l5 N3 r - Vue.directive('focus', {
, V6 n. D, b6 ]. E8 M: }* L - // 当绑定元素插入到 DOM 中。4 |# O6 j& M7 {6 @& h
- inserted: function (el) {
8 g8 O' y: c7 B t9 A( Q* W - // 聚焦元素1 t- D7 C3 }: I
- el.focus() C/ s+ {2 Z( o8 H6 b" p1 R; i
- }
. _: ?3 u ] e2 o% I3 V - }) w6 ~+ O% L2 T( _
- // 创建根实例* C: s3 \ V+ K/ B- P
- new Vue({
% ^: M5 r; p9 Z9 I( Z - el: '#app'4 E8 F3 k7 @1 t& m$ t! i$ k# U
- })' c8 x/ p: u( ]1 D+ w2 a3 e
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
! S( r; h) Z& q6 [+ y) ? S
2 I9 B, F6 X: K ~" |# D7 ~7 ]- <div id="app">: }& Z0 X2 d, l1 u! m. [7 F9 t
- <p>页面载入时,input 元素自动获取焦点:</p>$ c& N+ p. ^- s q" [% M
- <input v-focus>
# j- m" [5 C5 S, C6 X# Z5 p9 S - </div>
+ R% L9 ]4 k. e; P2 q& V -
( a- a! \8 w2 A7 m: V9 `5 }% a ?. } - <script>
& u1 V ~. Y- w% ?( v - // 创建根实例
0 U2 s1 @* F+ X1 A0 Q - new Vue({$ ^7 a" \8 G. F4 n5 B5 O8 M
- el: '#app',
, C. O. O( R" n. o7 [# A* \: ?6 Z7 ^ - directives: {
( e& o1 G' |: O; q! Z4 H5 s2 D - // 注册一个局部的自定义指令 v-focus
/ q9 ~; k+ T" p6 l9 N - focus: {
4 Z' F" p8 v+ p! H4 @7 [1 @7 i, K- ` - // 指令的定义8 x& U4 q0 ~ m/ H! U1 F
- inserted: function (el) {
% p+ e+ V* ?( h: c - // 聚焦元素3 Y9 j6 k0 n1 Z9 c5 T( f) k! @+ B
- el.focus()
% r4 Y, Y2 _* D K8 B$ b - }# J3 S$ P5 G; \( t
- }
- x- T6 L6 r& W M* o% V% } - }& P0 w4 y6 Z: {# `) \' h
- })( s! Y9 j n B3 S
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
/ T A3 d) R5 Y! G 钩子函数参数钩子函数的参数有: - 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 }。; r* B! h+ x6 ?3 z* h3 f9 h1 T- E% z
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
/ W1 v- R8 N0 f0 |" o
以下实例演示了这些参数的使用: 实例
: o& Y9 V" _8 H6 u0 S' `
8 ~8 }4 {0 |) u- o3 Y8 T* L- <div id="app" v-runoob:hello.a.b="message">
, S9 N# p! @8 a$ E/ c- d - </div>
8 h' L/ _+ \& T3 @" J/ Q5 o -
~+ t7 n$ r* v; ] - <script>
& H( c) J. ?5 n& J/ f - Vue.directive('runoob', {3 Q! J+ X4 D, e
- bind: function (el, binding, vnode) {" N. E. i7 `! ]% P4 M
- var s = JSON.stringify
; O" q5 h* X T' c - el.innerHTML =
' N4 D0 r1 R# b2 j3 g/ N% A% j8 _ - 'name: ' + s(binding.name) + '<br>' +
/ W# T* | }# @. h7 q- n, f a - 'value: ' + s(binding.value) + '<br>' +3 b) v* N0 m8 ?3 h& |1 S
- 'expression: ' + s(binding.expression) + '<br>' +
7 F ]7 z- |. N" E - 'argument: ' + s(binding.arg) + '<br>' +
* v+ b/ L0 `( _ - 'modifiers: ' + s(binding.modifiers) + '<br>' +6 w1 T4 j, W2 q8 e% T6 R" Z
- 'vnode keys: ' + Object.keys(vnode).join(', ')
, T7 `0 C7 T$ ?: N/ f - }, ?/ l' \' A9 q, n" k. M; w
- })
) G# n; W5 ^& K; z# G" E2 ~ - new Vue({! D6 ` C9 _( B! u0 q
- el: '#app',
9 V+ h2 U4 R l( O2 X: H - data: {
1 `2 ^, L2 K& y3 _. a) ?8 v - message: '菜鸟教程!'2 ^9 z6 U0 }) R4 z6 |+ h) g
- }
1 U" [. N* D, h) _ E ^# J2 e5 Z - })
7 U* k7 `0 b) K! Z - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
- v5 \( S3 V$ p& f' X; V- Vue.directive('runoob', function (el, binding) {8 M a/ _- a+ m; Y
- // 设置指令的背景颜色
" {" M0 i+ H0 h$ r, l - el.style.backgroundColor = binding.value.color( N8 e$ K# n+ v
- })
复制代码
, x' E }" l1 a. [
! L! M# m) N. p' ^+ u6 N, V' Q2 p指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
0 a/ X% u" I: U7 i I! e
* p* t* R, I8 L( J; U% h/ T, x3 @ h- <div id="app"> m3 j" ?4 w, f. D: C+ T
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
4 J d: A9 N2 B: D- q+ Z% \. ]4 H - </div>& ^( g6 q7 \4 Q. ^
- - b& a% E0 Q. ]' y' u: C
- <script>7 Q' e; V0 a6 W6 d5 h4 q. l- O' _3 z; e8 ]
- Vue.directive('runoob', function (el, binding) {: [1 F1 |! `+ p4 `1 N+ \. K# J
- // 简写方式设置文本及背景颜色( S O z+ D1 p. S& l5 I3 R
- el.innerHTML = binding.value.text
0 @. E/ }4 T, b6 B - el.style.backgroundColor = binding.value.color
8 J5 j: y2 q5 A3 ~8 E; @ - })3 u% f- D. L) G" |: z0 [
- new Vue({4 z* {4 j( ?& y9 U" _, s3 ^
- el: '#app'9 Q" f& h( D3 M+ H* @: y
- })* ?0 G) C2 t. V! ?5 [
- </script>
复制代码 : R0 b; S4 y* P0 X; q" |. H9 x2 N
& x* f# ?/ f' b' r4 O
2 a! S" e( x# h, \4 n& A: l9 ~/ a$ v8 R |