- v" U1 H7 n; R5 q% V* i! }# b除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例$ ~ C8 y# @& F
0 h8 Z0 E; f4 S+ i' g' |- F4 [
- <div id="app">
% T+ O* J- q# @! ~7 A8 d9 C' U - <p>页面载入时,input 元素自动获取焦点:</p>
9 C* s/ M, K5 m - <input v-focus>& x" `2 V. Y! t: j. Y
- </div>- f" K* `) q4 U: v8 y6 U
-
4 Y& k: L" H/ O5 j s+ R' g7 K - <script>
' M/ f" p! y" F! l& n" v4 |5 x$ ~. t; } - // 注册一个全局自定义指令 v-focus1 ^. o; |0 H! O5 V" l# h
- Vue.directive('focus', {
0 I3 @, `+ d5 s3 d9 [ - // 当绑定元素插入到 DOM 中。
( R4 j! c! }% G5 m - inserted: function (el) {
# {% l& p6 d1 f0 A& L0 @6 b8 k - // 聚焦元素
% ]! s+ t" Q; Z - el.focus()
& T5 D$ [4 u. Z9 G - }
6 v& M9 i V+ C/ ?- Z - })
: h) D, Y+ Y/ L: n3 c - // 创建根实例3 l$ x1 t! T+ {- n+ t: ~
- new Vue({% j @, j/ E' _( u) Y. X
- el: '#app' q: G. o+ k; x& e) _9 j" D$ c
- })$ ?6 L- d4 q8 B8 Z/ c$ [$ G& L
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例7 o, M6 \: w2 c3 D
7 V5 S- K% K: L+ d' Q' }
- <div id="app">
0 b" P# Y, i8 k, @ - <p>页面载入时,input 元素自动获取焦点:</p>
/ l- V; n3 u6 s7 b) } - <input v-focus>
; i) U2 r: ]. z, G8 y' u; i: ^ - </div>
8 z2 s8 ?8 M7 `4 W+ h& H# H K -
; h/ ~4 h) a! z6 T; E - <script>
. N* n! T, j& f - // 创建根实例4 M# _! K0 T6 Q4 z; ?3 ?% T+ A1 E; n) e
- new Vue({
# F/ d0 ?4 k# T% K - el: '#app',
+ M+ k* z3 ?) E3 y. B/ M: U - directives: { h! b9 k% M+ A
- // 注册一个局部的自定义指令 v-focus6 a# d' J# U0 i1 w9 w5 H
- focus: {
0 g: i& x2 ]8 f2 ^ - // 指令的定义8 K2 {, _9 u% q$ v! U2 Y
- inserted: function (el) {
5 w- T4 S$ f8 e( B - // 聚焦元素* n8 m: s7 ?9 Y9 z
- el.focus()
+ k; R7 o4 B+ H, K/ I! Z, k: O - }
0 L3 ?4 ^) e# |7 S - }1 u# x# t1 p& V0 Y
- }
. G6 X0 S) m: s$ }" ?1 b, o9 {2 o4 ? - })8 j; C, J) N' W$ A; a
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
# h! W9 |/ t/ P* W3 M 钩子函数参数钩子函数的参数有: - 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 }。5 ]' J, Z' p1 c) N
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
, H+ k* ?+ n/ j* Z5 Q, U5 m& @, n
以下实例演示了这些参数的使用: 实例, V1 Y! z- W$ J2 l$ A
$ d9 |+ V9 b: r! O- z0 q- <div id="app" v-runoob:hello.a.b="message">
. Q) M1 \. {9 W - </div>$ P j% N# S. w7 F9 G1 z% w' ?+ v
-
Z/ K7 d5 h) f5 `3 o1 @* l - <script>
3 y9 j0 A( `# g9 d$ p - Vue.directive('runoob', {
- G2 u( r, U2 d" g! G - bind: function (el, binding, vnode) {
& S! w1 i B7 N1 i( P% q: G - var s = JSON.stringify+ q5 D$ T% j) G
- el.innerHTML =8 W" a/ r& C) t5 }& a$ b) p$ S
- 'name: ' + s(binding.name) + '<br>' +( E* |3 Y/ j* {* `5 l( _# {
- 'value: ' + s(binding.value) + '<br>' +
! |) D" q- {. K8 M$ F5 l - 'expression: ' + s(binding.expression) + '<br>' +
, U5 U2 _: c' i; F% Z - 'argument: ' + s(binding.arg) + '<br>' +) u: C `$ k8 L
- 'modifiers: ' + s(binding.modifiers) + '<br>' +
+ r9 L+ `& O8 W. S; s+ h - 'vnode keys: ' + Object.keys(vnode).join(', ')
( D0 [) }+ p5 I, ~ - }
/ Q7 u7 E3 n T' v3 d/ H# n - })
8 _0 W! }6 z* [5 P; c3 m+ M6 ] - new Vue({
# `3 y8 G+ W6 X7 Q: R6 x- U4 @* a C - el: '#app',9 ]( v0 v7 E0 D2 ~1 C# L
- data: {
# p+ ]6 v0 Z$ B) h - message: '菜鸟教程!'
( s$ M" a: M' k9 }3 m# _1 L - }. \1 V3 h; i% G
- })$ `# T& I4 z; |/ ?+ O4 p/ r
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:; P# j+ y" Q- u2 D9 K1 F
- Vue.directive('runoob', function (el, binding) {- j4 u f6 C- z+ |" ^# `: e+ ~
- // 设置指令的背景颜色6 k' V& J Q! n' X, j
- el.style.backgroundColor = binding.value.color$ O0 N( G; L6 X W4 @0 {3 t% B' C
- })
复制代码 # w- o% y% @. p
2 U `% V, O# B4 L e0 _6 G
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例+ z6 }. N. r0 _5 V. q
F4 n( n1 m* E- <div id="app">
! ]! `4 j$ r) {1 a$ n - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
0 A+ k. n* W! a3 S1 Y - </div>
0 M' K O+ n8 Z% ^6 \ - & ^/ z) N. d+ b
- <script>' z ]2 J4 F* B' a" m; i
- Vue.directive('runoob', function (el, binding) {
1 |7 t/ P' M/ w) B! M: b5 u - // 简写方式设置文本及背景颜色 p3 w1 @$ N! r T0 _
- el.innerHTML = binding.value.text+ G) _. ?) K. N2 H% d6 r0 E e
- el.style.backgroundColor = binding.value.color
) e! K w8 W9 e, g - })4 Q7 t, j7 ~, D& f
- new Vue({- o+ u" V: J! L( Q
- el: '#app'- F2 c+ b [1 l+ u5 V
- })
$ s( v7 ?0 t- ]: K6 P% q - </script>
复制代码
; D2 k# p! O8 z! r% L( i# J3 X% J
5 D) s3 E- ~' B9 o9 X- s) I; {
|