) Z0 T/ H) m* f# D) }) Y- u除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例: V4 c: O) Y3 m+ L
' i1 _1 A6 L; H |- <div id="app">* \" _ i1 y: e+ t1 i% G' P+ a2 K
- <p>页面载入时,input 元素自动获取焦点:</p>
; ]9 a) n0 ?# t6 b* B4 g5 `. A - <input v-focus>0 i `# O/ T2 i" u
- </div>& r. ~/ f+ D1 R; I! x; ?+ V, d* f
-
2 g* e, x ?2 P! z s - <script>
$ O5 U9 A2 i) B$ i: [ - // 注册一个全局自定义指令 v-focus6 _: x- o% m' i6 K& r6 G
- Vue.directive('focus', {
1 N& t4 H( I0 D7 v. @- s - // 当绑定元素插入到 DOM 中。$ k+ Q5 A" K9 ?3 h* l: h6 F
- inserted: function (el) {
3 L% a) P* }7 `5 U e - // 聚焦元素" r" k$ k6 t, ?4 F: @1 \ `
- el.focus()
! u% b$ E' ] X6 A - }
4 ~4 J& ]& o6 c+ L - })) W- m$ A- ?$ T! c
- // 创建根实例- H) b# N& h) [% c% T5 t: J
- new Vue({
3 Q; Y! N. j( u% g) f0 m - el: '#app'3 {& b; x* ]! e+ B# z
- }): Z ]8 s) B6 T) |$ w) _7 B
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例" X8 O7 L. _2 a1 u0 S# f
# q# [3 m7 E! X+ T1 Z- <div id="app">
7 j' A9 L& i# _ - <p>页面载入时,input 元素自动获取焦点:</p>
6 q9 D# |9 ^$ b) m - <input v-focus>
: P' P- E1 e; n c1 a( c. _- s - </div>$ z9 C6 D) I v9 ?% q2 E
-
' c0 I, P0 ? |7 I" ~; g/ Q - <script>
6 e/ ?' f/ S. Y1 \- X2 V) t - // 创建根实例
* D5 g5 h, l8 }! z6 _1 e. K# G - new Vue({
, g1 y& [6 k- F8 ]& C5 g- g - el: '#app',
0 V2 n3 Z4 c5 w - directives: {" d7 F4 k. d3 ]) a4 u+ r0 F0 s' Q
- // 注册一个局部的自定义指令 v-focus: r. M5 `! U N" |' p& P2 C
- focus: {
7 r8 z' n9 x6 Q8 Q9 n% t - // 指令的定义7 `1 Q/ |$ Z/ \: l {, P: K
- inserted: function (el) {
- m, d1 X7 i9 A$ R: v# C - // 聚焦元素
! k) A4 s: _6 K - el.focus()1 ~2 t8 J% G! }! A5 s" i
- }, t [$ [ c* f! u- M- g4 d
- }
: r9 ^( c$ y2 A, I* a K - }8 b% _% H2 Z3 N+ C' |9 r9 M
- })
4 i* Z# \' J. x5 V) p9 Y. U. a - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
3 U$ N. ~0 \9 h# E2 O3 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 }。' _8 F, m) C7 l4 N+ \; X
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。) q# Q8 C6 \4 a! T, {
以下实例演示了这些参数的使用: 实例
& F/ |3 p0 }: N3 \
5 K) N* r s- ?3 J" C- <div id="app" v-runoob:hello.a.b="message">
" ?# F* l+ R9 B - </div>% t+ K3 s3 N$ i" ?9 ^
-
4 y: k2 P+ |! T- k; a - <script>
7 j! _4 F& f9 _) p$ }% T - Vue.directive('runoob', {
p9 S' X* L! n' [% I. A% C8 h - bind: function (el, binding, vnode) {8 V1 a$ `$ n6 L
- var s = JSON.stringify
# w# j9 A$ }$ K* q% z7 b - el.innerHTML =
3 C% ~. v F7 R' S - 'name: ' + s(binding.name) + '<br>' +& v% K: o* Q# @7 `6 t
- 'value: ' + s(binding.value) + '<br>' +
/ J% t- Q& X4 ~: |4 M5 B: n - 'expression: ' + s(binding.expression) + '<br>' +
& O) `6 y% ?6 Z% i/ B - 'argument: ' + s(binding.arg) + '<br>' +& m/ e0 w: l; u5 z
- 'modifiers: ' + s(binding.modifiers) + '<br>' +1 _- j3 h0 F+ [/ `
- 'vnode keys: ' + Object.keys(vnode).join(', ')
/ t0 t9 _2 k) s - }6 T$ _' z2 H' u, V
- })2 Y' K) _# R# ?) p' d C9 W/ ~
- new Vue({
7 D5 [" t' u4 G( V7 o# m' C - el: '#app',
1 W" ]4 X _5 f - data: {
. I, _4 f$ s% [ - message: '菜鸟教程!'
! ~/ A) d% @6 o9 v - }5 W W; O6 o9 F% M7 |( A& Y+ X$ u
- })5 D2 Y, p, c* m0 j
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
6 R5 t2 {+ ?& B* o9 b* Y- Vue.directive('runoob', function (el, binding) {0 d% P/ r9 X1 y6 k
- // 设置指令的背景颜色" Q% a) w4 g, x! P0 C; G
- el.style.backgroundColor = binding.value.color9 N) D9 E* V- l; d3 a1 I+ b
- })
复制代码 / S/ X0 ?& w' B) c& D1 _
! Y( x8 S( `7 H' K. C1 N7 ]9 R指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例% B" ~/ [2 h% M# c0 s. m4 _0 y
/ @0 v6 n. H5 a8 J, C( _6 w7 L5 u- <div id="app">
- G2 d3 ^" r0 f( R! n% p' k - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>) y, z3 Q$ I" B
- </div>
% L" [9 S; k# o0 f1 T -
! {/ u5 e9 k# P& U# g+ `6 ` - <script>
+ I/ I+ S) j& k& F/ h. d - Vue.directive('runoob', function (el, binding) {) G; v3 }1 X$ e# S3 N; M
- // 简写方式设置文本及背景颜色* q' X6 x. q+ i9 A) e2 q. Y/ ?# M
- el.innerHTML = binding.value.text
, |/ c! S! w F$ s; [7 } - el.style.backgroundColor = binding.value.color2 G4 T5 m9 ?% _2 X( w+ J
- })5 j; T0 ?3 ?) ?3 N
- new Vue({
, M5 y, J3 [$ b# N - el: '#app'/ s5 w: S& ]/ F, K
- })8 ^8 x. a% A& `
- </script>
复制代码 % o: J3 z4 r2 K
4 o( _# x- k" S: G
( v: i- T7 k, f$ t) n2 B
|