- d: u/ Y: M' j/ l. z除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例
; |% J: t/ u! g8 k& a+ r/ K h' e; \$ @5 d- J% J+ v
- <div id="app">& r# p6 D' e2 j
- <p>页面载入时,input 元素自动获取焦点:</p>
0 F6 Y& h( m7 z/ c$ K - <input v-focus>
: x" \, R: w- X4 o9 _ - </div>
: y' O5 E' h/ F) X4 y4 x+ ~7 J& K+ N' z -
; |2 U7 W( q$ j4 Y$ v: V6 Y9 A - <script>
, V4 J, i2 O" p2 P E' u - // 注册一个全局自定义指令 v-focus2 Y- N" q; n5 _- B9 S2 l+ d
- Vue.directive('focus', {
1 I6 A* m/ d0 S; p. W - // 当绑定元素插入到 DOM 中。
, c2 o+ u0 f' {3 B - inserted: function (el) {
7 n* N3 s; ~# q - // 聚焦元素% Z& l! k5 V4 R' ~9 q( `
- el.focus()
: H. M9 ^( `: }) t0 v - }1 j$ c, |; |$ l2 i
- })
" x p* W# K& S. j; V, o! Z% I - // 创建根实例$ ], A9 q% V6 @6 E# d+ q1 R
- new Vue({
1 {* h" ^0 V+ _. L - el: '#app'
' G0 [9 y7 W2 T5 ~7 A( C - })
4 D- h& e5 S+ v* l l* n - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
7 P" [0 w, q) q$ U! p5 N* U
5 m' b2 d7 ?/ m9 B- <div id="app">
, U6 R3 Q5 Q B; B - <p>页面载入时,input 元素自动获取焦点:</p>5 d/ s) F% ^$ h6 @% v# i
- <input v-focus> Z! g/ `8 ?- j" T0 h/ P
- </div>6 A: B [! W+ f' m
- ; x( v) h& ^$ I' n! _) D- D: Y8 F. k
- <script>/ f5 d! i1 u- O5 q5 h
- // 创建根实例0 `/ l# N( r5 t- U- r4 T+ Q
- new Vue({. G% W- z: O6 X3 u) {7 | Q
- el: '#app',
\( q* K# S/ u- C - directives: {+ w2 I$ ^' e6 I) ^' s
- // 注册一个局部的自定义指令 v-focus0 h" v: A& `, X2 T7 O. M
- focus: {
& G; M7 ~, {. {" U - // 指令的定义
- W' n- [2 Q- i' g/ H - inserted: function (el) {
9 M- S$ H* B) k1 V - // 聚焦元素- W+ A7 h( U( _0 u
- el.focus()
) A; _- c, v3 n - }
e9 V& m+ n$ h/ i2 I: _& d) [2 Z - }
3 Z. E" Q+ V5 Z$ k - }
. |! a# p! P- N# W8 s h - }). ~, y% {) I1 O( g) b( P" q. c4 b
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。
4 f1 r4 f9 z0 |. L 钩子函数参数钩子函数的参数有: - 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 I: E1 r" b' U5 ^
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。7 L, V4 i2 Y/ a6 e
以下实例演示了这些参数的使用: 实例
! l% b( A( I) P. W4 K
s( `( ?# n& l* \- <div id="app" v-runoob:hello.a.b="message">
8 n/ \) F) h) }) d6 E& B& w5 l2 w - </div>2 s$ }4 D4 x+ `5 x
- ( R' i; ]/ {/ H; @/ R' I- O% L
- <script>, X* \; L: V( T8 O6 ? C. j
- Vue.directive('runoob', {2 k5 L9 A: l q3 k/ P7 z. J
- bind: function (el, binding, vnode) {
" c4 H/ q. f+ A6 y$ V2 D* { - var s = JSON.stringify7 T9 n4 o, V% U0 x: H6 i
- el.innerHTML =
1 X, B1 M$ Y. s5 F: r/ y+ Z - 'name: ' + s(binding.name) + '<br>' +" [2 A# L* W7 k- l5 v4 r& @3 F
- 'value: ' + s(binding.value) + '<br>' +
7 I5 @ H/ w+ X& F4 N5 b - 'expression: ' + s(binding.expression) + '<br>' ++ g# |4 e2 N* P6 ]' l
- 'argument: ' + s(binding.arg) + '<br>' +' B, ~9 c8 P8 _: n( u- U9 g( Y
- 'modifiers: ' + s(binding.modifiers) + '<br>' +
/ m+ L; u! K- Y9 B0 L T - 'vnode keys: ' + Object.keys(vnode).join(', '): G; @# J# k) h$ h- i5 [" K' H
- }$ I4 {5 O9 F" ]
- })
: B2 I4 [( v8 p. A - new Vue({' a$ S- R5 j0 `3 R; J
- el: '#app',
* f6 @- e% L' n V' n) t - data: {6 D' n0 _; z3 k- A8 D* P- O+ G/ v
- message: '菜鸟教程!'1 [* Y& [1 ^+ R2 _. B
- }: M- t* O& {$ o0 w
- })# G, r0 S% ^3 W; w: `' @) t+ Q
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
& Y2 }+ k. a$ g# |: J- Vue.directive('runoob', function (el, binding) {2 W% R* I1 G. ]) m7 ~! v% {+ G
- // 设置指令的背景颜色
+ [+ a+ T g2 S3 ?; ` - el.style.backgroundColor = binding.value.color; Z: |& r! H* b$ }6 c
- })
复制代码 , m" k( F. Z/ ?+ q5 [
* l3 h4 [. ?5 J9 t5 H- C6 H
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
8 D& i/ R Q- R7 F! l' E: p. b* ]* h" j0 Z: f4 ]- x
- <div id="app">
+ r/ g% E6 f. a9 m - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>! U9 z( \0 \- {- X
- </div>; J$ r9 {. k0 L
- ; j* F' G- z f- X: [! X
- <script>& v/ F \: A8 g: U- ?! n' r1 H
- Vue.directive('runoob', function (el, binding) {/ |) e2 Z7 v9 `+ k! x9 w4 a3 v
- // 简写方式设置文本及背景颜色1 O% w% x" V) ~( M7 C1 [7 H
- el.innerHTML = binding.value.text: s4 c5 A8 x/ K# K) e
- el.style.backgroundColor = binding.value.color! m. v! ^1 ^: p. t9 H
- })8 h8 c9 m4 o, c N1 j
- new Vue({
+ c% S3 \+ l' ~7 {6 d+ e. B" b - el: '#app'* [! G. d; u( Y, B8 t
- })3 P: w# y) D1 x. j l3 Q' N% Y
- </script>
复制代码 9 d# [: Y& e6 A) v+ u! g
% [& U" v6 U( T* k/ U
, `* h% Q1 T$ I/ j- C/ {; a- h
|