( E" V) F- h( S3 Q- t除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
& g3 @% y4 a- X E# K% y4 e* @! Q* A' N
- <div id="app">3 L) M2 N/ `* N: ?. I% ^- o
- <p>页面载入时,input 元素自动获取焦点:</p>' a4 B; ] I4 g$ F6 ^) Y# W8 d4 Q
- <input v-focus>
& V' w' K) s% o0 \- o! J8 F - </div>
, ` _8 V/ j3 g2 }0 p. ~" ~1 `9 U - 3 Y. o/ T Y8 P$ _
- <script>% M8 c7 h* r7 l; [$ ^: t, J
- // 注册一个全局自定义指令 v-focus
, H: w H2 }( \$ t y3 N: w; p1 l - Vue.directive('focus', {
2 c0 d! J# R6 s0 F# B$ ?' P - // 当绑定元素插入到 DOM 中。
' l( @2 [+ j/ P+ S [ - inserted: function (el) {; A+ I( i3 [! A
- // 聚焦元素
/ x7 ?. J+ k+ Z8 s; J" k6 r5 B - el.focus()5 x% ?2 p/ p7 ~9 M
- }. K# G, O: n4 j( ^5 {
- })- J7 d+ y; [: X# m" U
- // 创建根实例8 P5 H6 r8 @' Z( ^0 o
- new Vue({6 |: D/ M' {1 U1 N! P _
- el: '#app'
# F9 d6 e- p2 F: ?8 n - }), @' [0 f# d$ E, y6 f
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
3 o; d3 k/ X( V K% P$ y v% y0 y4 u7 Z0 Y% N6 O9 F% }; b
- <div id="app">
8 O; s& b3 a- \, y9 O$ c - <p>页面载入时,input 元素自动获取焦点:</p>
/ F' N- f, d$ l: Z6 C - <input v-focus>
& L1 R+ R% t. E - </div>
' @( g. c; r) a3 X0 Y& u. q - ; b1 q( L( g( C; i5 F8 }
- <script>8 B' E% g1 F' l/ Z1 z' O
- // 创建根实例
* g9 ^7 V, E# @5 T2 ^* q* X' z9 k3 V- Y - new Vue({
0 f2 q( F( W; s: B3 J; o0 s - el: '#app',0 n4 @! O% e" `- c$ N: t
- directives: {
, E/ K+ \3 c! F( f - // 注册一个局部的自定义指令 v-focus
7 n, Q3 \: K# L3 O - focus: { v4 q- V( Q$ P% t4 @0 C; G
- // 指令的定义2 x% J" L7 n8 q7 [
- inserted: function (el) {: B8 i$ Y* M0 d2 a7 E' v# ?) M+ R
- // 聚焦元素
5 L' M2 M3 {* D9 m' g ~ - el.focus()
s8 M8 `" @6 S) k, K - }" \1 ?; i$ H* J8 ]
- }
3 N. j) ]: R& f- K0 T2 M1 T* Z7 q - }' c" [6 ^. o4 \* W: u& s+ x
- })$ }' p0 c8 U0 C. e4 o1 K# C
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
' ^6 Z# z# y. ] 钩子函数参数钩子函数的参数有: - 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 }。
) G& E+ w9 o6 x# S9 J
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。, X) g# S z: ]. f) T; O, j8 V( n
以下实例演示了这些参数的使用: 实例
% O; b/ i5 h2 ^' a4 d; x8 l2 r, B2 k4 d
- <div id="app" v-runoob:hello.a.b="message">; F. n" |7 @8 H$ b
- </div>( {: K. t1 P: l# U$ C" z
- ' R# ~+ t5 h% e* k
- <script>
) z, `0 X0 K. X/ [1 {. ^0 y1 Y. \ - Vue.directive('runoob', {" c+ c2 d+ p! P9 z9 R6 r$ H
- bind: function (el, binding, vnode) {4 S( @% L9 m( V- l
- var s = JSON.stringify8 q5 C" \2 y3 k) E8 k" Z- r8 j; L
- el.innerHTML =" `& E7 M5 {$ Q: Q" B |# _
- 'name: ' + s(binding.name) + '<br>' +
2 g. `. _1 a, P$ | - 'value: ' + s(binding.value) + '<br>' +: m6 A3 ~% f. J! m
- 'expression: ' + s(binding.expression) + '<br>' +) i7 W9 g4 L0 ^. I0 ]
- 'argument: ' + s(binding.arg) + '<br>' +9 d5 W6 `, n w3 C
- 'modifiers: ' + s(binding.modifiers) + '<br>' +: V0 I+ [( g1 ~7 n
- 'vnode keys: ' + Object.keys(vnode).join(', ')
' T- ?* C, Q4 [. H/ R - }" H+ X V: q, h$ G9 A
- })
: }; ?. z; m7 ^0 V' C) r) c8 l - new Vue({
; n+ J- Y: R$ f5 m - el: '#app'," k2 L I* z/ N" m7 v: r q% a
- data: {9 k; k0 W: W' j$ T/ @
- message: '菜鸟教程!'
: k) z) L7 a9 c0 z- }/ q% w# w - }$ \+ u. C0 B. M1 o
- })& ]( s+ N; S% s4 q, ?2 l
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:" s) o4 X1 b( Q }; o/ F
- Vue.directive('runoob', function (el, binding) {
+ ~, a# _; e8 J% A* h5 c M - // 设置指令的背景颜色" j9 X: J( n+ `* I
- el.style.backgroundColor = binding.value.color
" c% V; }. r/ R9 p2 v5 d5 _" C - })
复制代码
. x0 E: F* F, N: v# P1 ~7 h A! @
: S9 K( y5 @; O$ {% |指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
! E" D& N6 s) z) o* r
2 D: B4 E: {' j# p( L- <div id="app">/ s& @7 q' l/ ~( K2 e
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
% }6 F5 F! X% _1 z2 y8 z6 a4 c - </div>
+ h, h5 o, L: o9 }6 \ -
4 E Q4 \7 h5 q - <script>4 b7 ~. J7 `( C' r9 ^ E9 C' m
- Vue.directive('runoob', function (el, binding) {4 ]: E' R' X" I% p; f
- // 简写方式设置文本及背景颜色
, `4 M/ }5 [+ B& T/ [% m - el.innerHTML = binding.value.text
2 f8 N& G j8 J - el.style.backgroundColor = binding.value.color3 y) O' m# b" @) x& i9 I
- })
# c9 @7 u& G% f - new Vue({
% Q# ^9 \* S( n7 f) ^) }6 B - el: '#app'
) E% L0 a! G: t/ |; D Q2 F - })/ ?5 i9 |0 {/ P4 o
- </script>
复制代码 3 H: h: X9 U% A# \* o$ o/ h, U
- m- x7 d0 F; S, q+ H0 C8 o
0 e7 ] M ]4 P t: m
|