J; Y! ?5 r$ p/ e% F7 b除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
0 }3 U) |: _# M$ R# ]0 s: I% x6 G9 r* |) K# b3 G
- <div id="app">
" v$ t# @3 `8 q7 X8 m$ s - <p>页面载入时,input 元素自动获取焦点:</p>- i x6 R# G! H* n' W
- <input v-focus>
! c2 R8 {( K& } - </div># N! L( p5 x8 ]- B# |! h8 g
- ) M+ p* \. S9 e2 P$ ~
- <script>, G$ I5 }+ T( l& k4 N' K
- // 注册一个全局自定义指令 v-focus
3 H3 n9 x' i" u5 P - Vue.directive('focus', {7 v# Z- _. g) r; O" R6 ~# v; H
- // 当绑定元素插入到 DOM 中。
3 K2 R" F5 G" W; ? - inserted: function (el) {% g' S0 \7 X4 B4 d7 o
- // 聚焦元素- S% W: f2 P0 Q, U- h
- el.focus()
2 L- q+ K V& R* S& C. u - }: H0 C+ e: q9 |! H/ }
- })
& }7 j. H9 r6 D7 z2 ? - // 创建根实例
9 x( H) Y& R; h6 X' j) X - new Vue({
, Y7 r8 n; s B+ m b: Z) {1 O - el: '#app'
2 W. S, C$ Z7 P0 R, Z+ ? - }); _- P/ n7 |9 R! d: j7 T
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例3 A7 ?3 t" B0 T1 P$ y' q$ f
% y( S- F) F7 y- <div id="app">
( A7 R% K" H: j5 X! S% H# B - <p>页面载入时,input 元素自动获取焦点:</p>
/ L8 ?6 H1 c/ T/ I; ^ D - <input v-focus>3 x) h4 z0 c: o* T7 a
- </div>% [+ I) r( n6 b- q6 O2 E; e
-
( P1 i/ C, y3 c - <script>
# ~! H1 ?& v7 Q8 y - // 创建根实例
& ^7 E* h" ~/ _& s - new Vue({
8 a5 i n" n# d4 H; J6 _ - el: '#app',
* R8 }6 q9 C3 _8 C6 F' w - directives: {9 h3 g) {$ O1 q1 S7 Y7 V
- // 注册一个局部的自定义指令 v-focus
: o9 f& D: O6 P! V - focus: {4 C8 Y# o/ ^' c0 N8 D) P
- // 指令的定义
4 m- b! W1 m7 A) e% q2 A - inserted: function (el) {1 R: K: u% E( Y% X
- // 聚焦元素
! h* v( V9 l. V' n7 s0 n8 v - el.focus()
. p3 }, O1 r7 D$ ^' ~ - }
* T; @) J# Q4 y - }, w2 K) }1 B" R+ f! A
- }
6 d3 E4 a3 j8 y' c* ?- i - }): F! h9 w3 W1 a
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
# o" C0 X, l; n0 t( 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 }。+ S+ h1 a6 s( c. D& Z: L6 p
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
& D1 |) v, w- K. C4 I! M: m
以下实例演示了这些参数的使用: 实例* f' X6 F* P% F, i3 }1 \8 g
5 u9 j& r) T! I" t7 Y- <div id="app" v-runoob:hello.a.b="message">
! r$ _; `7 ~) Z, d) x% l* } - </div>8 ~7 G" k5 ]$ z/ [- c, q
-
2 d. @; N N$ _7 v/ m5 c3 ` - <script>; S8 @6 M7 r" v& q% R, f
- Vue.directive('runoob', {0 L$ r% f. F# u1 J7 X, D/ x
- bind: function (el, binding, vnode) {
5 l0 N; W$ @9 P% q* x1 W - var s = JSON.stringify4 P9 z4 b9 X5 U9 i0 I1 b
- el.innerHTML =
. P' ] P: _( x ? - 'name: ' + s(binding.name) + '<br>' +
5 p* m0 j* I3 Q! ` - 'value: ' + s(binding.value) + '<br>' +1 j; o, K+ H; ^( ^& Y
- 'expression: ' + s(binding.expression) + '<br>' +
9 a. w) ?8 B7 i - 'argument: ' + s(binding.arg) + '<br>' +1 d% Y9 x) o3 Z) f7 V3 c
- 'modifiers: ' + s(binding.modifiers) + '<br>' ++ ?0 k3 X9 \! K% N
- 'vnode keys: ' + Object.keys(vnode).join(', ')
9 ~- ~5 }) M! ?% E5 }% _ - }
& K$ D; q/ N- }& s6 K4 I B - })! j) j7 p" P9 b6 ]5 j7 a9 G' ]
- new Vue({
, R2 ~. }7 }0 b5 G7 \ - el: '#app',
. z$ ?! n5 \( o - data: {
5 ?* `8 e: O I8 R9 A* Y4 z - message: '菜鸟教程!'& a& P+ _% Y0 L( y5 [$ X
- }
4 f7 F9 |& I' ~4 e9 m7 G% } - })' w# A8 n5 {# `4 {$ d
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:2 S0 K3 s4 j. F* c0 }- l
- Vue.directive('runoob', function (el, binding) {
! M' o# S* _. \8 z/ P6 ~ - // 设置指令的背景颜色+ x% u5 v/ g' ]( a
- el.style.backgroundColor = binding.value.color7 ]$ L, O+ B' g% w
- })
复制代码 # U) T9 `/ T' E
' @' q7 l7 p" p" m7 d; d) v1 w指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例6 G' `( K* @. ]( G2 c
% o. {& |" x4 k" K T# n! L- ^- <div id="app">
* g2 I: {+ ]0 ^8 v8 n# Z, ^- o+ ^ - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
0 C+ M: G" ~; O F: m: H& p! B: ] - </div>
# S/ J$ f" R1 z" a+ G+ g. u -
+ W: O# i4 E! x6 i! A- ^" z - <script>/ T3 ^% E# ^6 V( g$ q3 H) R
- Vue.directive('runoob', function (el, binding) {2 m. J2 e! k' v4 h
- // 简写方式设置文本及背景颜色9 J2 h( x2 W% O5 J0 v' J
- el.innerHTML = binding.value.text
4 M2 x) J% C' M$ `% M+ p; d# _ - el.style.backgroundColor = binding.value.color; V" V9 i! n2 i7 V! V0 t3 l
- })4 F: Z$ ]& @% a7 e: J1 \( G
- new Vue({
$ [8 s3 A' ~5 b" _' `2 G. H - el: '#app'
9 A: S4 D& J% c2 b, N - }), I+ J5 n6 J3 e
- </script>
复制代码
2 b/ I3 A) R, m: {! o: V+ x6 c* G& j. t4 @( v' i6 d4 ~ _' T
7 C/ o' r0 D, N: G+ @- P4 R |