2 `- \1 H" S# {3 ~9 ]$ F除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例; C9 i# G0 X* g) q& k* [
2 F$ B# m6 ?$ s: E- <div id="app">
9 c$ r# Y% U9 w( N+ y7 s7 V/ D - <p>页面载入时,input 元素自动获取焦点:</p>" f3 S& a- ~( `9 A- b5 K
- <input v-focus>+ s$ l ~! [9 ? m) ]: t+ e& ^
- </div>4 g2 G2 \9 f2 v/ f- G/ a& J
- $ m6 |9 y0 e. N' Z% n# n4 X- r* p
- <script>( I4 Z$ j& L, U3 M% F% K& v
- // 注册一个全局自定义指令 v-focus
7 {/ P# M% ^( T. {! N" [' n - Vue.directive('focus', {/ Z5 L7 A0 M! y% V
- // 当绑定元素插入到 DOM 中。
( G$ U! Q4 ]+ N5 ? - inserted: function (el) {
( {: r) J, l) Y7 w) _' V( M" N! m- Y - // 聚焦元素
) o/ {% N5 j5 t( Z' M0 c$ Y - el.focus()" d" s8 V, U2 G/ o# [
- }9 n# g3 W; X* S
- }). b- A4 H, X: o
- // 创建根实例
+ \3 W+ `$ y1 R4 r - new Vue({
/ {1 j' M5 N& t! E. `1 J - el: '#app'
3 n' B4 v! f# A3 c% t8 z3 C9 f - })
; h ~9 @' C e - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例9 _1 I! ^" o! Y/ D) @! A+ f
# {) H2 L( _8 y# ^7 R% I- <div id="app">( l0 m8 z( d" O* W
- <p>页面载入时,input 元素自动获取焦点:</p> A$ z9 g4 `4 n9 n
- <input v-focus>
! I- O1 V. a, ?" B - </div>
& Y) X' ?9 O& H/ j* L2 V- H -
8 G; D+ Y" p; M* C. M$ i2 G - <script>
5 K& e- t3 Q7 }0 J( F - // 创建根实例
8 ~& K! t$ ]+ d# M; D - new Vue({
) l& l/ p6 ]/ ^ - el: '#app',9 @2 K, P( [! B+ Y4 x
- directives: {8 u- Q" `* O; b: }( n. E1 M0 q
- // 注册一个局部的自定义指令 v-focus4 \, q% Y$ k5 e0 U5 j* `
- focus: {$ R* [2 S$ l7 `
- // 指令的定义
& \* [$ P( K" N7 P. h3 G. M - inserted: function (el) {) i' D5 i. }. P3 P/ u0 e
- // 聚焦元素5 E4 E) \/ {7 Q P% X
- el.focus()
5 |2 F+ q& l* `5 m9 z) s - }
5 D- o7 m4 ]( w& [- Y - }/ l* c! {6 [" I2 h
- }$ }( E) p7 Y: s5 p. K0 Y
- })5 {* F2 H; ^6 E4 v9 d D
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
( T& h1 q, V& K1 t q8 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 }。& B3 j6 E) q7 C7 J5 ^1 e
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
0 F2 Q d2 t5 P+ p$ @
以下实例演示了这些参数的使用: 实例
" e% H0 y) }7 y4 I) v; P0 @, l( c, f/ B# }
- <div id="app" v-runoob:hello.a.b="message">- B0 q$ s2 T* k6 k. ]' a. T
- </div>
6 w, D9 C2 O% ~4 m8 ?% t' |" z -
9 Q) c8 @8 e0 k. Z - <script>% U, S! {( a- J" E& F
- Vue.directive('runoob', {
. w' o' h; s: n/ P3 v7 M% Z4 y - bind: function (el, binding, vnode) {( q$ }3 X: F0 U# H. O. M
- var s = JSON.stringify
. }$ |' w7 @# ^7 d# Z6 `# p+ w - el.innerHTML =
" t* ?; M1 ^$ ?& C/ p3 K - 'name: ' + s(binding.name) + '<br>' +
5 _; V, c+ f5 d1 ]8 ]4 d4 w - 'value: ' + s(binding.value) + '<br>' +
0 N0 x; H4 o7 J0 F! \6 S - 'expression: ' + s(binding.expression) + '<br>' +
# ?4 Y- R2 ]) p/ G9 q7 w - 'argument: ' + s(binding.arg) + '<br>' +
4 L) j- j# a. a2 H - 'modifiers: ' + s(binding.modifiers) + '<br>' +4 C" g) k0 X2 G. `
- 'vnode keys: ' + Object.keys(vnode).join(', ')
: E+ x- o" G" t" s/ F - }$ _" s5 \' d' _6 s' C
- })
% S0 N* u s6 Z# K; O - new Vue({
9 P3 E& B, c/ r; X, q# f - el: '#app',
& u! U& p! v+ N - data: {% t9 x: h. `3 D% R; { R
- message: '菜鸟教程!'$ _0 f+ o5 w) y( j9 ?+ Y
- }
1 A' @2 L6 L+ }9 z) u1 j - })
! @- b, ?" p8 j5 W5 g - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:) t% v# n* q8 c5 s% j
- Vue.directive('runoob', function (el, binding) {, n+ \. R& l% Z
- // 设置指令的背景颜色
" I: ?2 k5 F9 M8 x3 f - el.style.backgroundColor = binding.value.color, k* z2 ~' U7 C. X& _
- })
复制代码
. b- U p5 c3 w6 @7 J3 b4 ] f$ G4 c! `" Z+ O+ {
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例6 D6 Z; `& v5 v
: p# o, z" v5 C8 q# N( d
- <div id="app">+ ~: H& R i7 U" k
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
" t. b2 W) F/ A7 w - </div>
3 w1 S1 t: Z- [" ^ - ( x6 r+ v7 c$ P) @. ~! H# d
- <script> K! X, X' P4 S, N' y# ~' A
- Vue.directive('runoob', function (el, binding) {
. ^' T& _0 K/ J) l1 c5 x - // 简写方式设置文本及背景颜色* {9 b8 |; ~& R" M6 _: N7 V& N' h
- el.innerHTML = binding.value.text
) _, P" d8 d- G# W7 S! {' T - el.style.backgroundColor = binding.value.color' a2 u8 Q4 O* h; q6 c& c! Q
- })( W, X/ L" p* i/ `
- new Vue({5 _: C1 w+ l+ z6 n8 `6 R' s
- el: '#app') u6 U& T. y& o. y; o$ }
- }). K4 Q3 t& } o2 J Q! a: @3 d% _
- </script>
复制代码 " Y, F& P% \6 @: _
7 q. F, H* r0 O$ G
( e& Z. |1 ^) }2 H) c8 A- g |