+ |) m8 m7 E1 B7 R
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
9 Q. [; h$ g7 p' v3 a. _0 X2 q- u6 m1 G+ c/ j) Q0 J
- <div id="app">8 G& f4 |/ R, D ?5 e! R4 d# U
- <p>页面载入时,input 元素自动获取焦点:</p>
% s }" A O# f* V) W+ u! x4 r - <input v-focus>
5 |$ E5 y2 ?" `% S* ^' d* I1 Z - </div>- ^% k$ e A6 d+ M. I
-
: V/ d- |' i2 c2 v - <script>
+ R" m2 I" ^. G- g - // 注册一个全局自定义指令 v-focus) z G! t. {% I$ ]! H; N
- Vue.directive('focus', {
% o+ O3 t% c M5 k9 G$ N - // 当绑定元素插入到 DOM 中。
) @8 `0 B3 j# T% U( l4 v2 r0 n - inserted: function (el) {9 H+ w: R* z, |: I/ F" N6 y W1 y5 K
- // 聚焦元素- ]# ]3 r- a# A3 b5 ]/ B
- el.focus(); J V. H3 X }2 c6 A4 P
- }
6 M8 r/ s* n. M5 ?6 g1 ? - })7 i6 J x# X1 D- q" w
- // 创建根实例$ N f5 I7 f1 |
- new Vue({- V* V5 }* ^( l( J
- el: '#app'
! K8 S9 g) Q- r - })$ b$ I6 u/ F' N+ @/ z
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例( J9 p* c: T/ W7 z. Q( a
* ?! N; V* r+ T7 {2 ~
- <div id="app">) e2 Z% r- j! f3 H6 C3 z
- <p>页面载入时,input 元素自动获取焦点:</p>
. K1 y" y+ V5 e G* O - <input v-focus>
& R5 a. k% v- h2 U: H - </div># U P4 X0 U$ g/ z% s
- 7 c* I. k0 u: Q/ B! f: n- k* X9 o
- <script>
' I- E" v0 X% j! U - // 创建根实例
& y* e" C8 ]; u- i* u1 _ - new Vue({
* N. J" d3 o5 X* [ - el: '#app',& d! i+ R e( u$ G
- directives: {
; P* @& J/ Q5 _% ?; Y2 d - // 注册一个局部的自定义指令 v-focus6 b7 }+ S0 ] ~( T+ o6 S
- focus: {
4 x* }; G; \0 Z9 O6 l R - // 指令的定义- u7 Z4 Z: s* p0 j4 u+ n
- inserted: function (el) {
2 q) d% G# t& B- N- U k: l - // 聚焦元素
' T2 L( S6 |' o - el.focus()$ R9 t! B+ x" Y d3 w6 Y+ ^# I( d4 R
- }
+ f) G. w9 @1 f7 J/ @ - }
& h0 `, y5 F6 V7 H9 u - }
2 ?4 @' i. c/ A3 H$ W2 s) I - })
# c( _6 b* C1 i1 m$ T - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
b+ Q. x- k, \7 P2 M0 K6 q6 l4 z 钩子函数参数钩子函数的参数有: - 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 }。
( s8 `# M' ?7 D! W& o9 f0 g6 Y3 e
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
2 f. f. f1 D6 ~) O
以下实例演示了这些参数的使用: 实例
8 I; e/ S* N K+ P0 W7 V3 x9 h
5 b+ ~: o8 h/ h! K; {- <div id="app" v-runoob:hello.a.b="message">, Q) p" S" N& |1 K
- </div>
1 a6 {/ @+ I$ V U P: }6 M, z - 1 v& h, z- E, [' S% B+ x
- <script>
% N t; ~+ Z* F - Vue.directive('runoob', {
. _: H, t- m- S$ V0 D- ]: a - bind: function (el, binding, vnode) {
5 U4 e5 _$ V( Q( E - var s = JSON.stringify5 Z0 C8 y3 z9 C$ c) v
- el.innerHTML =9 D: S! l! N/ }9 @" N: b; g
- 'name: ' + s(binding.name) + '<br>' +& |. f8 d5 H. N
- 'value: ' + s(binding.value) + '<br>' +( B, y: B S4 ^: d1 m+ G# Y5 a
- 'expression: ' + s(binding.expression) + '<br>' +* ?* d! U5 U( j7 { w
- 'argument: ' + s(binding.arg) + '<br>' +
4 {( w4 j( Q( _/ [2 G - 'modifiers: ' + s(binding.modifiers) + '<br>' +. R/ Q; H! r2 Z9 |
- 'vnode keys: ' + Object.keys(vnode).join(', ')/ s6 G, @& H, R/ L# t. B' @, t
- }- l* V1 I4 R. y. o! y6 e/ g
- })" n G F8 i5 N4 ^
- new Vue({
1 S) ]% k1 ^! s - el: '#app',
3 v* B% t: U- e9 j( C - data: {
2 Z2 P( W( R+ `3 j1 ] - message: '菜鸟教程!'3 I e2 @ K3 z. F
- }
' s s e4 _' X% m - })
- v' x! k, p2 C1 M! c - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
. Y$ ~9 u/ y( E8 C' G: T% I- Vue.directive('runoob', function (el, binding) {" G8 n8 S8 S+ S& [8 [: U
- // 设置指令的背景颜色* R+ ]9 G* u T
- el.style.backgroundColor = binding.value.color
# E! K. {3 q/ O$ h0 a - })
复制代码
& P2 L6 g8 ?) D2 Y( B/ l. b' D$ J
$ Z+ s# `9 u* x* ]/ W8 m0 t指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例5 A* o, V! U% c
j) {# _) ]5 c! v$ \; {! u
- <div id="app">
+ O/ f, ]7 c. P4 N0 ]. _0 k3 l6 e' X - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
6 N' s+ _3 Y a3 G# D1 P! Q* u- ^ - </div>2 u& A9 _/ H% p) S0 d
- ) b" J2 N/ {; z& C. A3 w
- <script>
* k" K' @! P! j* p) k - Vue.directive('runoob', function (el, binding) {
; v `! a8 Q# n! P/ X - // 简写方式设置文本及背景颜色- Z) i3 c. e# R" \
- el.innerHTML = binding.value.text
# I2 }1 T. P% A) g1 |1 ~ - el.style.backgroundColor = binding.value.color" r, N2 `% G. j; T8 S: E i
- })
' o3 x# K$ F3 B& O$ C* V+ Y - new Vue({. ^( ~) A( X+ u* A5 C
- el: '#app'- _7 K7 F( K4 y3 r/ d# G6 u
- })
) a1 o1 ~1 F3 a- j) M# [ - </script>
复制代码
" T8 p( \$ V/ ^; ~% X4 v
$ c* r: b; l& Q" _5 A4 k2 `7 H" a7 d0 Q5 Z# V
|