# q( i4 q+ p. ^0 n
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
( n# t* y$ \% S& P6 u8 F+ s3 M: _# r1 o- |
- <div id="app"> z# f+ x( ]1 C1 N2 d
- <p>页面载入时,input 元素自动获取焦点:</p>5 J" d, [7 i" C# A% N
- <input v-focus>6 p9 t; G2 L7 s# E1 L8 z* E, X
- </div>, W W# ^& f0 [' c6 d1 j
- ! a1 h* Z2 @2 s
- <script>
6 X* [ j3 k- s# E, K0 _ - // 注册一个全局自定义指令 v-focus
. @& c* u% ]" d1 Q) n! J - Vue.directive('focus', {3 V$ A8 i2 s+ V
- // 当绑定元素插入到 DOM 中。0 g, f# c4 ?6 b* l& o
- inserted: function (el) {- s& _# q# ]/ z3 y- N0 N$ C
- // 聚焦元素
$ ~' L/ z2 e, ~% j - el.focus()
- E' u; t' _) m" C1 v - }
% |- ]* U& O s - })
6 q5 Z1 g1 V$ s5 g# s0 R - // 创建根实例! C) h' U4 K4 u( |# m
- new Vue({
' O" q. W3 e: U+ D! k3 I' B3 @2 k - el: '#app'# O/ V" x. G9 S5 a v0 }. S
- })
' D' }! C7 y% i2 _+ y0 ]) ^ Q - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例: _' p* p0 K& Q0 g5 ?
2 p: z3 a$ ]* D. H5 E$ u+ A- <div id="app">
; P- g! L3 f, G3 m7 E+ e8 Z9 Z$ [ - <p>页面载入时,input 元素自动获取焦点:</p>
( W, I( C7 W- h0 t9 p) t - <input v-focus>
0 G9 `' ^0 C5 O+ |4 k# o- ~! N - </div>
& n& V. |/ t& M+ ?. q5 M& A - ( W, z: u, ~2 f9 e+ U/ b( A
- <script>
7 n+ v5 ~; N: H; j# ?/ I. T1 o5 w8 N - // 创建根实例
! m: F8 [$ I+ _9 l+ q3 U! F! ~( B - new Vue({$ j. i1 g0 [1 r! }% b9 i( ]
- el: '#app',! L. J. v# Y$ c1 s0 N- }
- directives: {3 O1 u+ w9 b$ b& X
- // 注册一个局部的自定义指令 v-focus( b; e/ U, y" b3 r
- focus: {$ \# H5 Y$ F; O' }
- // 指令的定义
* Z( R+ ]! ~( r( w$ s7 c5 \ - inserted: function (el) {
. T( H8 K4 d0 ~. l" }9 z - // 聚焦元素) W/ E: R) h( o. U
- el.focus()" E: s! Q/ m' N% o) ], b! A
- }: ~" O# W7 s" a. {7 f
- }- o ~. v# d: q6 |
- } k' `+ Y4 K5 k
- })
# F4 `6 r9 _& Y9 N - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
; s) ^+ L& A. n$ l5 K5 }. O! G 钩子函数参数钩子函数的参数有: - 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 }。
6 r' I) v6 p# P
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。. E+ M& o( ], l& a' J( D& f
以下实例演示了这些参数的使用: 实例
4 w! ?, @/ T3 _1 v# `1 |" s) f8 E. c k3 V% ^
- <div id="app" v-runoob:hello.a.b="message">
7 M; f( V, f! \8 l6 g - </div>2 R! Z, }! j+ g# {
- * i# J, [, y; J! ?* z# t
- <script>
1 m0 S8 _# H' k2 n - Vue.directive('runoob', {- v4 @2 R3 \; K3 w% d9 `* K
- bind: function (el, binding, vnode) {
( k! E P! C2 N' s7 {! @, [ - var s = JSON.stringify; R+ n: p. V5 i7 s( x
- el.innerHTML =
" i8 i2 z# M- `8 A$ d u8 B - 'name: ' + s(binding.name) + '<br>' +# {* b2 J4 \, O
- 'value: ' + s(binding.value) + '<br>' +# S$ E; m; F. e. N3 Q: P
- 'expression: ' + s(binding.expression) + '<br>' +- M" q' }8 o y9 }& { w0 Q
- 'argument: ' + s(binding.arg) + '<br>' +$ _7 b9 u) a1 ]/ `) u1 c/ J
- 'modifiers: ' + s(binding.modifiers) + '<br>' +6 s: H S1 B# [4 K) w
- 'vnode keys: ' + Object.keys(vnode).join(', ')- m' H* ?7 O" L% d
- }3 S T! X f U+ P1 c# D
- })
) i+ m9 \6 {% I# B- e0 d - new Vue({
8 C* {7 M. W+ l: `+ J - el: '#app',
& J: r9 S: F& [' K9 s: O5 y - data: {. U6 p1 K4 O9 T6 M- v# D" R
- message: '菜鸟教程!'
' v/ V" w/ _- }) c1 X8 E - }
- \" U" X7 d8 y; Z# v2 S6 {3 t - })4 I" ~' U$ o9 A/ b6 c4 q
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
7 ~: O( H" m$ l8 m# [3 f. p- Vue.directive('runoob', function (el, binding) {0 @) R/ Z, r$ g% r q
- // 设置指令的背景颜色# w5 A( x. Z% w- v! L+ X1 ~
- el.style.backgroundColor = binding.value.color
/ D% t0 h6 J2 ^ T4 q - })
复制代码 3 S' \, i/ ?2 c9 p2 C
& ~1 k- R* k( Q5 U" a8 g指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例8 x( F5 N ~! x
' g# u7 N; _7 ^$ x
- <div id="app">
6 c2 k; u; d4 c9 o - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
" `1 i- s* P. x - </div>+ M% g2 ?$ V8 b/ Q2 d
-
, v5 A) o o) r8 q - <script>; D- Y$ B9 I. b
- Vue.directive('runoob', function (el, binding) {
' ]6 Z3 s) B y9 B5 c - // 简写方式设置文本及背景颜色& e: T7 Z0 Y# R, K/ ^7 ?
- el.innerHTML = binding.value.text3 G, ^1 d1 B$ j# l
- el.style.backgroundColor = binding.value.color6 C$ k' V' Y. E7 M" q2 J x0 [
- })
: w, \- M+ s; V3 Y [0 i K - new Vue({
# x) B! Q c8 q3 e q+ j - el: '#app' X! _1 y3 s( |3 X
- })
* O8 Q3 B, _0 l- C4 F - </script>
复制代码
" D5 C0 g& a6 X5 h- Y7 V
2 e, ?6 l8 I( p/ e" N& a' Z
* @( p ~6 ?. `6 E, N# W |