2 I- ^7 T R% u- ^9 F& v4 g
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
& o: ?/ F2 t: P' {& D0 A4 U* c0 q, Q8 D
- <div id="app">
( p9 R) y5 e9 P. K - <p>页面载入时,input 元素自动获取焦点:</p>. u B; H2 a* ]/ l! R0 g) w
- <input v-focus>; y. i$ [- T. X' _
- </div>. {+ M' ^& U, H n8 T+ \
- 3 q4 e2 t/ |1 B% [
- <script>
, L' c: ]6 x' O4 c3 f0 T% _: q/ Y - // 注册一个全局自定义指令 v-focus: x9 { s* K8 ~0 q) g
- Vue.directive('focus', {
5 G. O) R6 n" U! [9 s; R: ` - // 当绑定元素插入到 DOM 中。
1 b/ U5 n8 E# J1 r, O$ h) s - inserted: function (el) {
% J7 ]7 ~) @, b/ r% v+ T, A' n - // 聚焦元素4 M6 f5 a. ^& A
- el.focus()
/ m- f3 u4 u2 c( H: g% M) t. y7 y - }( W6 [: A3 V0 Q& G2 E9 J% `6 M
- })
4 o& t0 k1 n+ Y- p5 y2 U% { - // 创建根实例
/ X7 F ?6 K0 }! Y' c1 }- i* F" h - new Vue({0 L& X6 M8 t: w( o* L% G
- el: '#app'
1 g1 N+ v2 h; Q, h4 ]: J, s, s - })$ A& \6 B9 j, `/ U
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
! G- P4 c3 Z9 b5 H# W2 @' z* k. l2 ]* J. r& N. ?
- <div id="app">
" O5 z& P! ~8 z: Q6 v0 Z - <p>页面载入时,input 元素自动获取焦点:</p>8 I& h" u+ a. g, u( B' I/ m
- <input v-focus>1 X* X( C9 c$ P8 c7 C* S7 M
- </div>1 W) |9 |! t/ c1 o- [" p) y
- w6 a! `6 @. p6 R/ \# x6 G
- <script>
$ g) k: D& o$ n - // 创建根实例" |. W& N& Q8 x! d
- new Vue({
+ ^" _4 M, ]1 W3 M$ H6 ]/ { - el: '#app',
9 }- x% E# n- p& H0 b - directives: {' V9 f, I( m1 } m$ e/ b
- // 注册一个局部的自定义指令 v-focus- I. x' }5 u; K$ G* a Z. m2 S
- focus: {
. C. I# U/ @% h- r - // 指令的定义3 h6 K: c/ k% `* ?3 C9 E' F
- inserted: function (el) {0 W* ]* n# q6 v( N8 j' ]6 Y
- // 聚焦元素( v1 E9 I8 {5 w0 m" a
- el.focus()
- q* a1 g% u6 u# g0 o# j - }4 P6 K4 f, K; @
- }1 o8 W$ N; F+ \# y# j; S
- }
# q; `% R& L! k- U3 e; S2 V - }); _9 ^7 j7 ~" d; y3 g
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 + g+ H* b( d3 Q; L' {7 e
钩子函数参数钩子函数的参数有: - 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 }。
* L+ H" S9 z" [0 i' ^
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
" r. ^9 l3 N6 G# R" [ U0 Z
以下实例演示了这些参数的使用: 实例
# }" ^) i4 n5 b' ~( j6 S0 x) w6 ^0 z5 F5 \$ u b+ A& N
- <div id="app" v-runoob:hello.a.b="message">5 h* G" ]& ]& P) O6 O+ m: v
- </div>: A3 H; `& B- C! V' b
- # n+ A% h3 Z2 Y, ^3 m5 \( R
- <script>
+ t4 c$ |' ~: V' T/ s7 s# D7 w - Vue.directive('runoob', {+ B/ `- L5 {+ j: c1 N7 a( J
- bind: function (el, binding, vnode) {- s0 r1 p4 g, t5 x& z; K8 Q( w7 E
- var s = JSON.stringify
& e. W: N" S& E+ ?, k - el.innerHTML =
}/ ^& p4 L2 x4 Q1 o I - 'name: ' + s(binding.name) + '<br>' +& ]) B; H7 f& N: I6 r1 X9 d
- 'value: ' + s(binding.value) + '<br>' +
+ {' ?4 `/ q* F" F9 I9 a. M" A - 'expression: ' + s(binding.expression) + '<br>' +2 y5 V2 i7 k! m* u
- 'argument: ' + s(binding.arg) + '<br>' +8 q* L% }& ^' ~+ [6 V
- 'modifiers: ' + s(binding.modifiers) + '<br>' ++ h5 u) g' [8 Z+ B9 M
- 'vnode keys: ' + Object.keys(vnode).join(', ')) o9 i) E& y' x( j! d& F5 X- E8 w
- }% Z/ X3 U: F% y5 k, W
- })& S8 [7 b5 c/ x; F5 s! Z! _" A
- new Vue({
- c. z8 ?+ H, n# S. h3 [8 e- E1 | - el: '#app',
- K8 N/ g3 G% T- i6 C6 c6 p - data: {
6 W7 x* c5 B5 C& ?0 ?" |1 C1 p - message: '菜鸟教程!'9 I3 l& a9 W0 ?& O% S* Q
- }, M3 P* V! y. w( V+ n
- })) X0 H* S* B9 i4 [
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
- v+ k9 b! X( Z: t- Vue.directive('runoob', function (el, binding) {
7 k2 ?1 _) i% a5 U8 S7 G9 p - // 设置指令的背景颜色
, [6 n% Z5 X: M: f$ Z! } - el.style.backgroundColor = binding.value.color! N p4 T) d9 [( @
- })
复制代码 ) ]; I7 x$ @$ n9 ^- b1 f
* B0 N l! w) \- o3 U+ ?指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例$ ]' V" N" g4 a6 m; Y g
* [2 ~/ [9 `7 Q- j0 t: n. a6 L- <div id="app">
# H4 h' f* }' X* a3 A/ f( f - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>. V, B! a% Z* j5 i, |
- </div>
. W( F# s0 O4 C2 F/ j; ] - 5 P+ U2 L4 \: o& `" O9 U! [! N
- <script>8 |3 u( @3 G0 Q* d X/ t) H3 G
- Vue.directive('runoob', function (el, binding) {
8 d H% v3 P: @6 c - // 简写方式设置文本及背景颜色% d0 Z+ L0 O0 `$ R
- el.innerHTML = binding.value.text- V+ h0 U# p9 n. h
- el.style.backgroundColor = binding.value.color4 @4 w9 G$ l& b% D
- })
! o6 p( J% L1 B- P* J - new Vue({
9 i5 k# I- z! O, ^4 e% B8 Y - el: '#app'( i& q4 W) [2 S7 W
- })
5 @: p5 e% q7 O" a - </script>
复制代码 2 K4 b& q4 Y' L1 |; Y
7 o) x. h: a; B1 h% ^
5 Z1 J7 u, v7 \0 o" N ] |