cncml手绘网
标题: Vue.js 自定义指令 [打印本页]
作者: admin 时间: 2018-7-4 11:36
标题: Vue.js 自定义指令
H, m& Z% B" y8 a: Q0 |. ~% G除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例" d0 u, F9 K; e/ m
% D# d5 m. ], s$ q7 E8 R
- <div id="app">
/ K* [0 q$ @/ ? - <p>页面载入时,input 元素自动获取焦点:</p>
) f. K( I2 A$ z' l - <input v-focus>
2 O% w8 O( ^ q8 N - </div>, r& ^& C, x v
- : D ^" Y( m$ u* c$ l
- <script>5 g7 L# _7 o$ f) q- X& e
- // 注册一个全局自定义指令 v-focus0 M( N, I3 X% Z: X9 S G
- Vue.directive('focus', {
; _. s/ J! T* J* J. x" e - // 当绑定元素插入到 DOM 中。+ M3 S3 c$ G1 S0 U
- inserted: function (el) {: `& U5 S, C; M' I9 k: C/ [( r
- // 聚焦元素
* J9 r" T4 \& J7 U* {9 | - el.focus()! `9 Q$ a+ T5 ]0 [9 v% S2 _
- }. {! V* g8 H: L( S+ ?8 ~( Z& }
- })$ c/ s% M3 v# N& a
- // 创建根实例
6 W; Q4 ?2 E" a* @8 G - new Vue({
8 E7 ?2 e6 v1 [0 |' U* v- C' ` - el: '#app'
5 @, a. y0 o9 `0 m" e, k% j. T - })3 S) o, }- X) a3 _! A( h ^
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
+ i* Q; w5 z, E
) Y D# u; Y1 x% o- <div id="app">( ^ ^7 x$ C7 O: l
- <p>页面载入时,input 元素自动获取焦点:</p>
$ i$ u/ V: B' |: E7 @, `1 S - <input v-focus>$ t4 x q& u: z7 }
- </div>/ W( o% t V% x7 E2 Q6 e) W. u: X
- 1 @+ z$ b0 A( R. P; L3 ~
- <script>
8 Q! v8 \) V& f0 I' b. @1 m - // 创建根实例* k' i+ L o' F! D1 ?
- new Vue({
A& G) I# l. I! C - el: '#app',3 R( S+ z3 \$ v1 v( n, t) W
- directives: {1 t2 n+ [ r- S9 h
- // 注册一个局部的自定义指令 v-focus
9 ^; V8 C- W/ n9 V. S+ h- _ - focus: {5 m5 j% v$ _% t& L# M! L# A, W
- // 指令的定义
% Q( a' `# ~, y# V8 v - inserted: function (el) {% Y! _1 ~) d2 r5 f$ P& v
- // 聚焦元素
' b2 N6 N1 a: D$ p' \ - el.focus()
! `- e4 f; _, ~: w - }( N1 @* l1 X1 d4 `5 r6 `3 Z* H
- }
1 `" w2 b" b* ^. r1 t - }
0 i4 Z- E( S3 s6 N: c1 y - }) m3 Q$ ?7 e' \3 ^
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选):
bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
unbind: 只调用一次, 指令与元素解绑时调用。
' f8 Q, w5 z( F( g Z1 N% q6 Y
钩子函数参数钩子函数的参数有:
- 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 }。
$ v3 N" G) U/ {# Q% i; t2 B
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。5 ~ T) a" \- @& }% \8 }8 J# j6 q& o @
以下实例演示了这些参数的使用:
实例
6 y* } x( Z8 |( k0 i/ b( N/ `% O$ B+ n" O0 z, V/ O0 D
- <div id="app" v-runoob:hello.a.b="message">
+ C( Z; J; f: Z1 x) f - </div>0 N% y8 A# V: P8 F7 h7 q
- # u8 @- y( n4 [4 l( B* E
- <script>
; b7 r; ?( s# Z1 |0 z5 k7 I: s - Vue.directive('runoob', {
5 Y" T8 K6 t: I6 S) A/ A - bind: function (el, binding, vnode) {
q K' p' t: c - var s = JSON.stringify
2 c- w1 Y/ g4 }% {) ? - el.innerHTML =
' B: ]$ H( M3 p9 y - 'name: ' + s(binding.name) + '<br>' +
+ h/ ~$ c3 g1 d$ B4 O6 l* g - 'value: ' + s(binding.value) + '<br>' +
. g( D6 y1 w% j1 J5 ]% K - 'expression: ' + s(binding.expression) + '<br>' +% I, c7 Q" G+ U @* \, F8 S
- 'argument: ' + s(binding.arg) + '<br>' +
) \6 O$ [- M! y0 e8 Z - 'modifiers: ' + s(binding.modifiers) + '<br>' +
2 b# @2 I: o8 X- k+ ]7 |/ Z ]! n - 'vnode keys: ' + Object.keys(vnode).join(', ')
) W6 L% d$ O( y% [* H - } h8 H+ i: O# d; G
- })
" [" ^; m4 k/ @! M* u$ t* \ - new Vue({
: K& J0 \5 H* L# Y1 w6 A - el: '#app',
: o- Z5 z1 C: M; B1 j% m - data: {
- y Z2 y8 K% a - message: '菜鸟教程!' L$ d6 [' u3 G. a
- }
. f6 V* D% o5 [7 G5 Y/ E - })
, i4 l5 z2 L4 g) k; [ - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
4 _( z& M9 p2 p6 a5 x; S6 P/ A0 l0 X- Vue.directive('runoob', function (el, binding) {& b) ^. L5 H2 b& u3 Y* P9 P$ E) z
- // 设置指令的背景颜色3 N, X P& G" d
- el.style.backgroundColor = binding.value.color: @" f, w; ?7 U, } l+ W% f' M4 ?9 L7 |
- })
复制代码 7 O( N2 u9 B; }$ C9 O
5 a; {6 ?5 q* ^1 a: {指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
1 b1 W- u8 C4 E1 p, y, a3 `- O: x! o$ _: h# e9 t
- <div id="app">0 l; E1 ?; F; C) p; {
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
9 U. s$ y6 t4 k5 q$ f2 B+ R - </div>
5 `5 |* q( w2 K' B$ B4 O3 M -
4 C+ Z0 O8 U: G7 B6 C8 f - <script>
- H5 u' Y9 X7 V: q - Vue.directive('runoob', function (el, binding) {! Z0 ^+ i) k( q) S7 z. w3 ?
- // 简写方式设置文本及背景颜色
: E. H9 X" Z; ]9 H% f8 s4 V - el.innerHTML = binding.value.text
3 E% `% M1 K# b5 R3 M5 [ - el.style.backgroundColor = binding.value.color
! ~9 E6 a2 @' w+ o/ @& _ - })" Y+ `5 K+ ]1 J" L& O @3 a4 l4 H
- new Vue({
; \" Y: l4 ~+ R$ z* ? - el: '#app'
; ?2 p7 [+ j7 y6 I1 G4 E* L' h - })) D/ q9 E6 V4 {
- </script>
复制代码 ( N F& j- j: Q4 Z; {* h
* E% X. ^; x+ d9 h' A
8 X6 e0 o% b' a" C
| 欢迎光临 cncml手绘网 (http://www.cncml.com/) |
Powered by Discuz! X3.2 |