$ m2 m: k2 C6 K9 i- h% k* K2 G1 V; n
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例- g3 ^( p; o y
* G# y) W& q, Q& G) Z4 S# q
- <div id="app">! m2 d( t" j' [! d6 F
- <p>页面载入时,input 元素自动获取焦点:</p>) u& r1 {% R4 b/ c. q
- <input v-focus>( \4 O3 P- _( T2 s7 C
- </div>3 d3 |; ]# Q4 C5 h/ ~! u+ L* K8 i
- & {% K3 B* h! U p+ ] X9 v
- <script>" O. d) t) X" ^ L% T9 O
- // 注册一个全局自定义指令 v-focus2 H A2 j6 R* s f/ t6 ]
- Vue.directive('focus', {4 q& f; `6 d! V$ Y: h$ K9 |
- // 当绑定元素插入到 DOM 中。
. ~, E& k+ R( o( O2 k$ U! E - inserted: function (el) {
" g( r) L- T1 l1 ~* x. x - // 聚焦元素2 z2 Z! ~0 Z1 G6 p
- el.focus()# M! B" O+ r C8 x( D: b
- }2 M! r) D! i( o; Z* c5 n7 M$ U
- })
' P8 B3 U/ h. p; u' U - // 创建根实例5 e# C% {4 k4 N Q+ d: W
- new Vue({% R9 i4 s1 ~# m
- el: '#app'/ {5 O+ x9 q9 t( J- |: _8 ? e
- })) H% F0 D) S! Y6 q" S3 P4 X
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例) V( e9 s/ ^7 U
1 ]( C9 _( R) {" ~- u" j
- <div id="app">
3 I+ ^: ^" d% Q2 X n - <p>页面载入时,input 元素自动获取焦点:</p>
7 ^6 I* e r- y4 w4 r+ I - <input v-focus>
, F$ \8 r7 L/ @7 M8 J - </div>
! F+ n! L6 U6 d8 c" ~( ]6 W! K -
0 l6 }' c. U: j - <script>
; x/ o% k: d$ f n7 k# C3 ? - // 创建根实例9 ?" c8 u; y- h7 Y
- new Vue({/ p' q& X. x. L8 u0 ~- H0 r# P8 V
- el: '#app',
- M! t) V! i& _ - directives: {- U* [" }+ i4 K+ c% l: K
- // 注册一个局部的自定义指令 v-focus
3 I: R3 B& B! y1 s c1 a - focus: {* ~( l2 E( c( [, [0 Z {
- // 指令的定义
1 M/ P9 \% @9 V+ h - inserted: function (el) {- u: @5 B5 n9 W' I4 A
- // 聚焦元素
! J& ]4 E F* M - el.focus()6 W1 p2 k5 `( T0 |
- }
+ Z) o( n( |6 P. O4 w6 j; ~ - }7 K5 N( M7 c* V9 F# k( Y$ H7 m$ ~
- }
; l3 Y( [( M8 r) a+ L - })' Y& \4 M! O( Y0 ~+ a
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 $ b' I5 S3 s2 C8 _1 M3 n' f
钩子函数参数钩子函数的参数有: - 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 }。
: H: W2 a* |; u4 J6 p
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。4 `$ j2 b; @' }
以下实例演示了这些参数的使用: 实例) H. O7 D* s7 p" y
# O2 m! d7 k { b! ]3 m" ]" N& ?- <div id="app" v-runoob:hello.a.b="message">
# N" v" h+ p$ b1 h: a2 p3 y - </div>
) `1 W: f! R! |' b! J( F! M - ! N+ d! H: I7 v% v- c6 `
- <script>; d3 c6 {. }$ P% d( r" v8 H! s/ ~5 J
- Vue.directive('runoob', {
9 O0 H, U. J" [0 e: l/ _( Z9 J - bind: function (el, binding, vnode) {
- ?) m4 G2 f' T - var s = JSON.stringify
8 j7 N; e$ V/ G9 \7 K9 t' J - el.innerHTML =
8 O9 s$ r5 k5 }8 E - 'name: ' + s(binding.name) + '<br>' +; _( ~8 a- l$ y; Y
- 'value: ' + s(binding.value) + '<br>' +
J4 m1 q5 a4 ?! l6 ?9 X7 L* ? - 'expression: ' + s(binding.expression) + '<br>' +, W$ ~9 K% E! `+ Z7 q r4 p8 F( d
- 'argument: ' + s(binding.arg) + '<br>' +
9 f. f5 o4 X W3 i* V - 'modifiers: ' + s(binding.modifiers) + '<br>' +
% g9 L# M! C& Y- a3 Q% _# e - 'vnode keys: ' + Object.keys(vnode).join(', ')9 V1 P0 [2 G$ I3 z0 Y
- }+ `4 P6 B5 Q' {; n! u
- })+ g# C( v+ k. d$ ?& f% S0 @- q6 v
- new Vue({9 J5 X6 Q }- |! n
- el: '#app',2 R6 p& n! g! B) l+ `- }9 Y' Y% v
- data: {, B# \0 H1 Q/ m6 e/ ~: p
- message: '菜鸟教程!'
3 j8 c2 K- e- D) _' a - }
& |7 s- W: r$ q% I3 k - })& `: R+ Z2 z# n4 o; ~
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:7 j9 u0 d4 i- d" Q: u. [
- Vue.directive('runoob', function (el, binding) { ]: W2 i" _5 [/ q) x9 U% t
- // 设置指令的背景颜色1 w. k N7 q1 p5 E: ]2 J0 ]7 O
- el.style.backgroundColor = binding.value.color" B- s/ P$ m5 t/ ?
- })
复制代码
7 y! w+ l Q w; Q
$ m9 ]" Q! S/ P9 E" {- R5 y6 |指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例: q. P7 D5 Y+ b$ b( ^6 a& T
! U: Z! y/ N* }( C- <div id="app">' A% N" \# ?7 U
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>3 v! D9 B+ r' g0 V+ G
- </div>
1 t% N. ~% y0 |( n' l3 \; c0 C) F -
- h7 x1 g$ n% k* T - <script>
& F, m) e' c% X* v5 Z' C - Vue.directive('runoob', function (el, binding) {
; |' @5 b5 J+ d# e O5 d - // 简写方式设置文本及背景颜色
0 ?6 b* u7 S+ t1 H - el.innerHTML = binding.value.text
* r8 Y5 R" K- I3 P# n5 m# I - el.style.backgroundColor = binding.value.color0 s1 j5 z8 I; ^2 k
- })1 W# x6 @) {, y4 G$ a- _
- new Vue({
: `* A- a, C% k6 e5 x& | - el: '#app'' C7 \6 _- D9 z0 d
- })
" |( o8 u/ n5 _6 \ - </script>
复制代码 9 ]3 ^" `5 V1 ?6 [
# O/ |+ E, M# L, y3 r
5 I1 x, \' @: t+ T/ ~' Q" U: T9 T, \ |