4 i- O% r, [1 H8 N% d+ ^# c
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
% K9 J5 o! Z/ Y+ O! R
. }1 P! F5 D8 {% @8 Q- <div id="app">, ^; g$ z, ^+ S/ y% R6 m. w
- <p>页面载入时,input 元素自动获取焦点:</p>, O/ e& j2 ?( L8 J$ g/ q2 R
- <input v-focus>
$ _. Z8 K% X" a% e$ ?4 R) V I - </div>$ I' N$ U* N; E% ^
-
3 e! j7 E4 W- i6 H5 X" Q) [( F2 O - <script>
9 i1 {. c5 [" B' A - // 注册一个全局自定义指令 v-focus
6 t, x; }$ E' r9 r( X - Vue.directive('focus', {
U+ \1 k! `0 [/ L3 P% @7 N - // 当绑定元素插入到 DOM 中。
+ y6 P1 d) L; t$ Q2 s- y - inserted: function (el) {
7 |+ i3 y F4 n8 Y. l* P) q3 i - // 聚焦元素
% K. ]; }1 Y% ^* Q" G - el.focus()7 M. S! m' k6 E! G5 l
- } R7 t$ }+ R) @! c3 C6 |' w5 _
- })' F# W6 j, E+ M$ |, o
- // 创建根实例1 O5 O; @. h7 T3 `
- new Vue({3 [0 Q0 e% h; D1 q i1 m
- el: '#app'& r5 T5 U- O, b" E0 Y) q0 W
- })4 U% H) y- T; b( N% ?
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例- {4 I- r) g' U
+ P2 L" A* w1 Q( s2 Y7 f
- <div id="app">
! N5 J) {; r2 Y: g - <p>页面载入时,input 元素自动获取焦点:</p>
?1 Q+ @. L3 E, ~& N - <input v-focus>! E6 i6 A: [5 o5 Q
- </div>) \# w" z6 N: g W5 ^
-
' E6 E& m) k' A2 Y - <script>3 r V: C( z/ L* n
- // 创建根实例
0 y- b# M& X1 u4 L3 A - new Vue({2 E: F6 h2 K$ E! ?! t
- el: '#app',: C: x8 H+ [! A4 B4 T7 [
- directives: {
" k% M e* W+ |3 b7 F9 y - // 注册一个局部的自定义指令 v-focus
2 ]8 h9 C* A3 |+ U; e: E+ H - focus: {
* v& ?% @8 |1 ~. @/ n - // 指令的定义
/ o/ U/ w- X7 x2 {3 e# W$ p/ z - inserted: function (el) {7 }% B- V+ F$ X- j8 y3 A c% R( D2 E' E
- // 聚焦元素
* m( l) Y+ m: @; X, c - el.focus()
; a% @4 i) {! E7 E0 P - }
1 S& X8 ]& y4 ?% } - }
/ Y( h( I+ |" N1 n - }
+ s7 z6 |6 A, ]' D - })
7 }( d* O3 b0 ^6 j; i) \) D - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 u. ~% F' ]% d
钩子函数参数钩子函数的参数有: - 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+ T6 C7 o o- D& E
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
0 V$ y) p0 m$ @3 N0 y
以下实例演示了这些参数的使用: 实例7 D$ x8 k% T2 ~! A
8 i% t! K# D: D5 Q9 i- <div id="app" v-runoob:hello.a.b="message">0 z; W* T5 |! `
- </div>! a8 D! w& o* b# N9 {3 P) I# [
-
% Q+ a' g6 V# g t+ l! [ - <script>8 Q3 L3 x9 X' E
- Vue.directive('runoob', {
% z# v) x5 ?. p - bind: function (el, binding, vnode) {/ I6 ]1 x! _; E9 z9 g
- var s = JSON.stringify
' W# \$ r- P0 I - el.innerHTML =
: h7 V+ D! b% V; Z5 @ - 'name: ' + s(binding.name) + '<br>' +( j1 K: Q5 i1 P9 w
- 'value: ' + s(binding.value) + '<br>' +
& i! ?, q# w1 ` - 'expression: ' + s(binding.expression) + '<br>' +
; D) }% o- q0 t: S2 E6 i - 'argument: ' + s(binding.arg) + '<br>' +
% o3 f: o& W7 C2 O" g - 'modifiers: ' + s(binding.modifiers) + '<br>' +' b6 B U& A& Y$ N' p! J: @
- 'vnode keys: ' + Object.keys(vnode).join(', ')
. r. P/ G Z/ {5 h, W- e$ t0 m- L - }
5 c0 M4 w2 o) ^& Z - })
8 A5 p; k6 d" o | x; W, h* x( t* A - new Vue({" `; M2 ^& u) b8 |
- el: '#app',
! S. N/ [+ S2 M& T0 x4 S - data: {
( V6 r& v1 e4 @$ o2 h" X+ r. V! `; w j$ T - message: '菜鸟教程!'
( u1 R: K/ E. b: ?) [8 S, e5 }" \ - }" M5 `% O J: |
- })
# ]- c- L* o7 D* O - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
& @2 n: Z7 z% J1 b( {1 f- Vue.directive('runoob', function (el, binding) {, B- J/ m r' t
- // 设置指令的背景颜色
: ~4 C/ ^' m9 t5 @+ b - el.style.backgroundColor = binding.value.color
9 M9 z4 Y3 X" d3 X# ], o" l3 F - })
复制代码 & I- w9 b2 R# T o w8 b
5 `- z. n0 H9 ~8 \% Q4 r; l指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
- M# i- k2 w5 w: T) i
3 C, w5 F; O* g- <div id="app">
) f; T5 O; }% K' i1 U - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>5 f: V. y, G( W5 h3 m9 K, u
- </div>" c O& Y5 a6 L* z5 M ~
-
; d, r& S+ B/ I - <script>
3 Q5 m0 A! M, T/ u* F - Vue.directive('runoob', function (el, binding) {# Y( R; c v1 n5 S7 {
- // 简写方式设置文本及背景颜色9 ~9 i8 j5 t+ _7 I& K7 ~$ Z
- el.innerHTML = binding.value.text
8 V% { i5 ?& h4 u# I - el.style.backgroundColor = binding.value.color$ I% x4 l) a9 N2 v2 i
- })
. C9 C4 x5 I4 K% z1 t7 J" ?' r - new Vue({6 c2 I1 n* s k6 \1 o
- el: '#app'
# ~: q- i1 A8 r( j - })
& b5 \+ g* a+ e5 z8 K - </script>
复制代码 ( {& P; y* L! O, r% n5 v2 V
! h x& @% {3 k
3 D5 O6 Y7 ~$ @
|