! T+ r* W& a5 T0 p* H$ \除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
# O* P! e4 P7 ?. E& L. D6 ?
A' J% t" k8 c- <div id="app">
% f$ S3 }" K( W, o - <p>页面载入时,input 元素自动获取焦点:</p>
c) {2 a6 |( |2 }7 {, t - <input v-focus>5 [1 ?# x/ v( w; S! v$ }
- </div>$ O% z1 R2 ~' D: s
- / a& E' X( _) s
- <script>& N- d9 ^2 u# _. p
- // 注册一个全局自定义指令 v-focus
3 O! { D2 a S, J/ N- U2 y - Vue.directive('focus', {
. t0 b! ?3 @: Z7 H9 u8 y* Z" b, G - // 当绑定元素插入到 DOM 中。
- o' e, ?9 q# n; m. d - inserted: function (el) {' V4 \# P2 b$ V3 h" S- k
- // 聚焦元素
; f( Z9 ^ B" a) f - el.focus()& D0 G/ N3 j% m
- }
, K$ Z( Z' m5 z T" T2 h1 m8 X - }), ~" h. c- B" N" p1 V3 ]
- // 创建根实例; s6 \- p& \0 [# y
- new Vue({+ Y3 A! T) S$ O& V" U# E
- el: '#app'9 l, D6 B5 }+ ^$ @" a5 {, ]2 r# s$ w
- })
/ V. w- b. P; r) o0 j - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
5 w# n9 E. |& e, g' |" q H7 K# d1 U( U! i
- <div id="app">
9 T p/ Y% p, Z' m$ y% J M$ a - <p>页面载入时,input 元素自动获取焦点:</p>
0 O( J q# y# J7 P* S' Z - <input v-focus>9 F" n z0 Y9 y( T8 M( b1 w& {
- </div>
3 g$ c: \, P* { Q+ ` - & t* G* u8 F1 ^6 Q* Z3 S
- <script>
( k6 `5 h6 \! P5 ?4 p4 t( E' M s - // 创建根实例
; I3 n* [. k. W* W- J# f( g- A - new Vue({
/ K6 J) d" N$ w4 V1 T; s - el: '#app',2 A. b `! w& X% U
- directives: {
0 }& I/ P) b; _4 i+ t; V - // 注册一个局部的自定义指令 v-focus
% l% e% g7 Q! Y' M - focus: {( x' v3 T1 [% q' J3 b) ]. R+ h
- // 指令的定义
/ _& ]! J: w8 g. {2 M - inserted: function (el) {
; H* V$ x0 S1 O B. t3 | - // 聚焦元素
* k8 v8 D' R: v) `8 k - el.focus()# z2 R1 \( M9 b6 ]3 Y' @
- }% H W3 F7 _8 Q/ v. j G$ E
- }
4 a$ Q2 r3 S) s4 v0 m/ d - }
! I- F* L: v( P0 i6 S: g E - })
) L- Q+ F/ a/ H6 X9 |% l - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
$ u: z* a1 ~! G5 V7 d: Q @ 钩子函数参数钩子函数的参数有: - 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 }。* K; f9 E' Y! t5 r; r( P* y
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。' F8 } W& H4 g1 X8 N
以下实例演示了这些参数的使用: 实例: D& d" K( k6 B9 ], \! _
_2 p$ Y# g4 ^2 I1 T% N( F# \- <div id="app" v-runoob:hello.a.b="message"># r- @+ S! J: ^0 E' u
- </div>8 L7 F5 h- b2 T
- 8 z% R6 l( a! h) @" S5 \+ G: R
- <script>
2 _& D) Q4 J4 D; x G - Vue.directive('runoob', { S* {6 D! F m( l$ R& O
- bind: function (el, binding, vnode) {( r: R2 h4 {% \ P: S! j
- var s = JSON.stringify
7 u6 P& M+ s+ _: K$ X3 G. T - el.innerHTML =) u/ s( Z5 |1 S6 w/ Z$ \0 O! }0 X! g
- 'name: ' + s(binding.name) + '<br>' +8 ]# }" \; q, v& k
- 'value: ' + s(binding.value) + '<br>' +! T& B$ [. U& V
- 'expression: ' + s(binding.expression) + '<br>' +/ [( R* g% B+ V4 R, u* j
- 'argument: ' + s(binding.arg) + '<br>' +
/ I$ |' M0 N) Q1 p3 ] - 'modifiers: ' + s(binding.modifiers) + '<br>' +
) B1 V$ M$ F8 U" @$ Y* W* c, i- U: Y T - 'vnode keys: ' + Object.keys(vnode).join(', ')
. e- B+ ~0 P. R% E - }
% l' q- T, Q$ p# Z, r$ Y - })
5 m- r" Q5 @ g8 w: @/ J# e# L - new Vue({
+ g9 U! ~" V- A - el: '#app',3 n# S1 p. [4 Y) M
- data: {
% c y" P8 |5 Z; { - message: '菜鸟教程!'5 G; E) K! S# |; M1 V
- }
/ B5 w* j$ B" ~8 B2 |6 _1 E3 ]- F - })
# |3 J; P# @. ~9 e: B# @3 M - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
8 X9 F' y+ {9 N, b% P- Vue.directive('runoob', function (el, binding) {& h9 y% e* T6 c: r& X! o
- // 设置指令的背景颜色2 U4 q A/ e: v0 {. Q8 e. q, r
- el.style.backgroundColor = binding.value.color
2 i! v) l0 c0 D - })
复制代码
! w" v+ @7 h/ G) F5 o+ `- r2 `; L: l2 o8 W
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例& l8 T! n6 P: d& y0 Y- B
8 t% C* h, i, w0 B- r8 \$ I- <div id="app">
/ D: x+ e a H6 @ - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
, _, W# K" c$ i3 k& s2 ^ G) m - </div>
% Z% }) l& \/ _; u0 l9 Q - 0 a; ] g2 A# @& C% M
- <script>4 d# v& C: l4 v# s0 o, Z& c% y
- Vue.directive('runoob', function (el, binding) {
# M7 h- {; S9 g; l! K& C; j5 C - // 简写方式设置文本及背景颜色
- q& R* C" c1 a; c" c' Q8 A - el.innerHTML = binding.value.text/ c! i3 C! f J& |9 |' e
- el.style.backgroundColor = binding.value.color/ X. k; v; ~" c h; i9 v7 m
- })
4 M; Z* O5 L* t: O# s; p; y - new Vue({
% \6 ~" ~, p/ N x) j - el: '#app'
/ w4 n0 z# Q, { a - })
J& p: X! [6 _9 J& y. k - </script>
复制代码 4 j9 {& b, Z% m2 u) |* m9 C( e; N
) z2 G0 J& P: _' H" z5 J6 L0 O) @5 \) \, G
|