cncml手绘网
标题: Vue.js 自定义指令 [打印本页]
作者: admin 时间: 2018-7-4 11:36
标题: Vue.js 自定义指令
( C! V' r3 J7 r: l& I ?除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例) g3 R! G5 t5 m9 S1 |
3 S- c5 @; \, o8 v0 X4 U1 m" n4 D- <div id="app">. K5 b6 J+ p; D5 J2 C1 I
- <p>页面载入时,input 元素自动获取焦点:</p>7 v0 M1 k+ [& Q
- <input v-focus>
$ b# m0 O T- m9 w7 M* \* E2 t( B - </div>
& t- b ?# X7 y4 c- c5 ^6 q9 ? - & {1 _ J, ~0 H
- <script>
+ h& \" z5 z$ _/ k" g+ q( } - // 注册一个全局自定义指令 v-focus0 t, w: `2 R% G* H9 X
- Vue.directive('focus', {% v' j5 v' n4 @2 G" Y
- // 当绑定元素插入到 DOM 中。" R7 X2 C5 r2 g. l! Y8 l: I2 x5 i
- inserted: function (el) {
& K/ J3 p! Y5 Z; w - // 聚焦元素
* u9 B) v7 g; q! {# I, }6 Z' j) B - el.focus()! |; t9 k6 v" Q& u6 H4 _: p
- }; h9 J, P5 x) F+ p
- })( t3 t2 c2 f# q5 M8 R: i) s' E# t
- // 创建根实例0 g/ c2 i5 Q) f( `1 h% J* J8 E+ t
- new Vue({/ F3 m0 G# R7 G C
- el: '#app' G! U. c# d" P$ A# Y$ w
- })
# {! m, C" K3 T0 j - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
; O% k. Z3 b3 a9 h/ d( r# y" A8 ~$ A, p5 g
- <div id="app">9 u E+ m9 O. C# \$ [2 D6 R$ o
- <p>页面载入时,input 元素自动获取焦点:</p>
6 q' b' I8 {& H# q( u - <input v-focus>+ ]) N6 _0 Y& r5 h& l7 o; c
- </div>
& j) a& y( C1 p -
2 V M) g7 u) y& ^2 M l9 D7 ] - <script>, E a- ?- { j% f! ]0 q& I
- // 创建根实例2 ?9 u4 Y& N, Y/ `& |+ C
- new Vue({
, O# h7 m4 W; c% m, c - el: '#app',7 z0 A w3 {0 d+ M, ]& u. C
- directives: {& X9 z- b. ?% T4 V# q$ }
- // 注册一个局部的自定义指令 v-focus2 l1 u' g8 ~! s2 I- }" G9 C8 R
- focus: {+ i; a3 C* M; D9 D
- // 指令的定义
! F! U, I5 i \- V0 D: |1 B - inserted: function (el) { I* k5 h9 k7 K
- // 聚焦元素6 I0 k4 U' \* K
- el.focus()1 j0 _3 a8 {+ v+ _
- }
6 l9 z+ E+ K7 S, a c - }
8 z9 [: T2 s8 S5 G% F( T$ ^ - }
% X" R4 b& e# ?. t' I; g: j - })
" o% g& f6 q1 j0 n. g7 z - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选):
bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
unbind: 只调用一次, 指令与元素解绑时调用。
: L( G6 t b( X) s5 P/ W& 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 }。
; M" Q0 g" B! |6 H7 J5 }& V2 K2 e z
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
" ]" S, X" w% {7 ]7 ~
以下实例演示了这些参数的使用:
实例
" d L* \; Z! d# S, U5 }: O; e) D) f" ]- ~
- <div id="app" v-runoob:hello.a.b="message"># k. q( F- L `
- </div>& k3 D' c* s# \ `& \" M
- * ^& u/ U- d1 Z
- <script>$ v1 ^7 W5 i6 o8 j$ ~ P
- Vue.directive('runoob', {! P9 h3 ~- k# \
- bind: function (el, binding, vnode) {4 Z) |2 D" h; I+ S' T
- var s = JSON.stringify; Y- p) Y3 s2 b+ N& l
- el.innerHTML =
5 U$ J9 z4 }2 | Y, U3 Q) k* ` - 'name: ' + s(binding.name) + '<br>' +* q: h$ E6 {6 z1 V E( C
- 'value: ' + s(binding.value) + '<br>' +) e. A2 L) f: J! |
- 'expression: ' + s(binding.expression) + '<br>' +9 ^* ?& r! ~# A: s; _# z
- 'argument: ' + s(binding.arg) + '<br>' + V: d, k7 [5 f$ m
- 'modifiers: ' + s(binding.modifiers) + '<br>' +: i8 ^7 R$ _5 @" j
- 'vnode keys: ' + Object.keys(vnode).join(', ')
" N: Y/ Y( m4 q C) C) V - }4 j7 A0 G) J* T2 u7 [3 x6 {+ h6 i
- })
$ [* n3 A+ }1 b* V* V" e - new Vue({
% V' Q( Q4 Z5 f, x8 ?8 J - el: '#app',1 k! q) D1 Z/ P% r" C' L
- data: {
! C3 s' M" O- h' t - message: '菜鸟教程!'
3 w, c2 _- C% k( a3 a* [* C. Q$ J - }1 R9 y7 _+ p: {) ^: l$ `
- })
+ u, B; k& g% F9 h& U& T5 a - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
+ O1 w! Q( k/ G6 [$ G8 o- Vue.directive('runoob', function (el, binding) {# O9 y& h3 d6 f9 H! p. x; l
- // 设置指令的背景颜色
& g/ h8 k, R0 I - el.style.backgroundColor = binding.value.color
1 ?9 |, C! e4 p% Y* }3 a - })
复制代码
- q# o, C3 u' W
" q5 i9 [% u c( r) K指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例. _/ ]' b# k, }9 p
' D0 S- C1 ^8 ~9 o9 }
- <div id="app">
7 f6 }! k: J4 E* P t/ Y' F - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
, K& e, `8 S- X% m1 O [ - </div>: `) W0 A( f7 S* y' X! ~
-
; M9 y/ ]2 K6 A2 V: Z; x) w - <script>
) Y- z0 N! {! \6 }3 y - Vue.directive('runoob', function (el, binding) {$ Y7 k4 W, Z* z4 I" N* w
- // 简写方式设置文本及背景颜色# W w @0 L" \1 a
- el.innerHTML = binding.value.text o: `* \& W3 h# C& B4 ~8 m1 O
- el.style.backgroundColor = binding.value.color. M I6 h4 ^6 {; X4 S6 S
- })
: O( C* E2 C, r) \, A4 e: c - new Vue({
( `2 Q, B0 m7 O/ k+ ?# h4 w - el: '#app'1 ]4 j' y- l; A6 `8 j* Z
- })
2 J" O3 I$ A w - </script>
复制代码
) }- w, \& J5 _* k$ I6 |
" V" |- p" H9 {' R2 ^" g' H, O" ~" t* \0 i2 X
| 欢迎光临 cncml手绘网 (http://www.cncml.com/) |
Powered by Discuz! X3.2 |