1 {: l7 i7 M# {% K2 `2 c: {除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例3 O7 j6 {' ?5 ^# ^
T U7 d! e! P, ~, x( X/ |
- <div id="app">7 I! |: U5 C! Y, l2 w) N
- <p>页面载入时,input 元素自动获取焦点:</p>
. L* `# a0 r, `3 n* \6 O' K& X: H4 T1 s - <input v-focus>5 l2 c2 m% o; M% X
- </div>
$ a8 T. [3 J2 I* O; u -
W p- p( q* F+ n3 y: C" K$ N - <script>
0 a. D. e$ f: q I; Y6 o - // 注册一个全局自定义指令 v-focus' ? N7 x$ w. D6 ~
- Vue.directive('focus', {
. `7 ?1 Y- b: s) }# x9 Z) F" v - // 当绑定元素插入到 DOM 中。
& `! x8 o8 A) D/ W$ s7 W$ O - inserted: function (el) {
- Y' g# H/ U* T. d4 R8 i( q - // 聚焦元素
/ J4 Q: x; M: T& z - el.focus()2 D* v3 t* x+ I+ D+ v1 d
- }
5 ], |% A- V3 v, m2 f' V1 A - })
# N( [5 U3 K8 K9 r5 K2 b - // 创建根实例4 {; F0 W8 _2 Z! L
- new Vue({
; |0 K# Z) x' C6 b3 ` - el: '#app'& p( D/ J* F6 ~' d
- })
. O( b8 J3 ~( v. g - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例$ K8 e) s8 X: W% k; A
8 q) L l9 N) I9 V A1 |0 f- <div id="app">
- \$ D9 K: l5 W& i - <p>页面载入时,input 元素自动获取焦点:</p>
2 f F2 ?: l2 v7 l c - <input v-focus>/ b' ^9 m( O) y- ~" W( p( X
- </div>+ g J0 G9 o) s/ o2 K' \4 L# g& ?
-
- R# M0 z4 l c6 W; i - <script>' V+ [+ y+ v$ M9 T0 R% r$ B! [
- // 创建根实例
" q$ C- E: [6 q t- w5 X - new Vue({3 Z& t, v. Z; Y3 m0 s g
- el: '#app',% B5 w* K! a% P* M4 d, N0 l
- directives: {
6 ~3 c# v$ |; ^2 S( J - // 注册一个局部的自定义指令 v-focus
/ w* p' Z; L+ i" g - focus: {) x" S4 n- {! H$ |
- // 指令的定义
. E6 E4 _1 }- m9 J* C - inserted: function (el) {
1 c3 p5 ]. t) h; P* f" f - // 聚焦元素
! O2 J7 Q. l t( u# J; m - el.focus()
}, O/ V; |, ?, t" \ - }
, K1 ]4 X9 u/ G - }3 m$ i7 F0 u, }# P
- }7 v) f$ P; Q# B/ h; B
- })+ C6 H. @! R t+ l0 C! g6 B
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 ' K( }0 t! i$ r
钩子函数参数钩子函数的参数有: - 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 }。, ^% P8 |' w: u
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
+ M5 p0 z9 F3 F- S
以下实例演示了这些参数的使用: 实例, C0 I; A8 Q1 ?- c, R
0 }6 ^5 B9 u1 u) [6 R( ^" \( V4 K
- <div id="app" v-runoob:hello.a.b="message">
" o5 b& t; O" Y) Q - </div>
( ^6 Y9 ^8 s7 z9 ] - 9 p1 x8 ?( ]9 X5 g8 e9 S
- <script>' t* W3 L: c& c. e
- Vue.directive('runoob', {6 z* Z" K# t$ {* ~
- bind: function (el, binding, vnode) {
& K( v/ H$ F C8 m4 z - var s = JSON.stringify
8 E& L+ r% x6 ^. ~% u - el.innerHTML =3 X' l$ ?* Z* |6 t
- 'name: ' + s(binding.name) + '<br>' +
$ S: L( B5 h$ m, \; R e3 L l9 Z - 'value: ' + s(binding.value) + '<br>' +6 @1 M. v& m$ ]5 d5 d! z
- 'expression: ' + s(binding.expression) + '<br>' +0 b) I3 N j6 f) L) i1 v' ^ s
- 'argument: ' + s(binding.arg) + '<br>' +- ~% {- d" G9 R/ e2 g; O
- 'modifiers: ' + s(binding.modifiers) + '<br>' +. p; E# E J6 E( D
- 'vnode keys: ' + Object.keys(vnode).join(', ')
% z: ?+ E7 X9 ~8 g1 d - }) K3 M, Q$ M/ p0 ^
- })1 T1 \2 e/ O5 s% v3 m
- new Vue({: u2 k9 l( z% L5 A, \1 ~
- el: '#app',
6 f5 p, r# T1 h7 c6 b - data: {5 u. K. ], i b4 p$ g1 ?( Q
- message: '菜鸟教程!'- |5 A) s- [$ A: Q" p, R
- }# q# d* g% [; |6 H' Y- U* E. w- X7 d
- })
0 t% Q; Y0 v8 a5 K& }* B( _5 j# b - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
* p0 _( @: M) g) Q3 H" B- Vue.directive('runoob', function (el, binding) {- H& `% D5 w- u7 ?- r
- // 设置指令的背景颜色7 N8 K5 |7 p# m4 W' d. a! a
- el.style.backgroundColor = binding.value.color
+ U. p, }! W& p- j$ v7 E# `/ g S - })
复制代码
& H' f6 h. i# }4 X7 |' x
" L1 V# C. @' _$ M6 d. U9 Z指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
; r3 q4 \* U. W; c6 l+ {& S y
% s5 p" {: T) P* B- <div id="app">
; V+ x$ a2 g! Q( w - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
! Q* X+ }1 k& Z" K( { ?9 X8 ? - </div>
0 l: I; U1 P; t, x -
( q+ D A: Y4 n! W- Y - <script>5 X+ ?: v( s$ d& C
- Vue.directive('runoob', function (el, binding) {
_9 }" T( g9 h r - // 简写方式设置文本及背景颜色- n( z" V2 l( Z! O6 Y( R3 `. O
- el.innerHTML = binding.value.text0 z# y; y. v C+ ]1 T
- el.style.backgroundColor = binding.value.color, B$ x* c/ f$ W4 b8 p/ I, b' Y
- })$ C# o! o( K! X9 E
- new Vue({
' L: d1 l4 P, v& G: V0 J - el: '#app'
. K W( }. Y! j" r9 q5 ` - }). G R" F+ o; ^
- </script>
复制代码 ' X# D: y# O$ `: q
+ ]0 j I8 _# t" S4 k4 `$ D$ G8 q3 y/ P0 V1 t( ?) X
|