cncml手绘网
标题: Vue.js 自定义指令 [打印本页]
作者: admin 时间: 2018-7-4 11:36
标题: Vue.js 自定义指令
g( M$ u$ n4 Y# o
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
, [" e D! w6 s1 ~- i* @% p
$ b* @+ F3 N* {, g4 @- <div id="app">4 m3 X' i1 n7 ^
- <p>页面载入时,input 元素自动获取焦点:</p>5 K8 Q: q7 _+ b' {6 a. }5 H
- <input v-focus>
]* _0 E8 w2 G: d - </div>
/ x! }- w( G0 ^9 m - ( B" C: N: A6 U, m- m* t; N
- <script>8 I* \ Y" c E& I# t2 |* A' s$ [! k
- // 注册一个全局自定义指令 v-focus
9 a& @/ j6 v4 P0 G9 A - Vue.directive('focus', {
4 K: B0 f4 J1 ^9 F1 A4 W2 A - // 当绑定元素插入到 DOM 中。$ K+ e5 @1 W: V+ s! S8 u+ o
- inserted: function (el) {9 O5 R8 Q5 x, z# I
- // 聚焦元素1 Y# f) ~0 I* ~- f
- el.focus(); v- H" d$ ^" h7 O1 a* F
- }7 |/ B1 h6 v% p" k' r
- })9 E1 y- b3 t2 |2 Q+ G& g6 Y
- // 创建根实例
& F6 Y9 @- h, C% A5 K - new Vue({
; S+ ?7 s/ y8 l" B5 \; ~ r' ]/ i - el: '#app'
% P. W9 M7 k) ?9 K& ], k' f6 q - })6 }$ ^) o. F7 w( o
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
+ S3 c8 y! ]6 m/ [; X. F9 q& m: [6 y1 W5 R S- q$ J$ ]) e" G" k& k
- <div id="app">2 {: u5 f3 y2 c
- <p>页面载入时,input 元素自动获取焦点:</p>
- c9 [5 E9 u L - <input v-focus>2 f8 Q" Y: n- g" Y j' i' |8 P- Y4 Y
- </div>% \3 _! p5 |: N1 L7 j+ w
-
; f, ~& s5 z& U k( r - <script>
3 w( p) C- z$ t% r& I5 B4 p( o - // 创建根实例: g! T+ Y0 t6 U. {' L% f# ?
- new Vue({
! d0 e- |) y9 j9 ?& z; v' ] - el: '#app',
1 r* L) D: C' ^9 u$ w+ D5 K- I5 } - directives: {
3 N1 ~* M3 h) i+ g - // 注册一个局部的自定义指令 v-focus! S ^, {4 b+ j/ m8 Y
- focus: {% L" T6 r0 o; M
- // 指令的定义: ]9 D, n7 U9 N$ k; m! Y% u
- inserted: function (el) {; d+ K0 }$ U+ S+ n
- // 聚焦元素, `2 J. r; V W0 [- w6 H
- el.focus()
% I$ D) t2 {0 `/ Y+ V% M7 a - }% x& d+ T# y1 t( m
- }
+ L9 a4 ?: A$ _ - }9 N m6 T% ^7 n7 X
- })& q' U# u: ]5 {6 |+ g
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选):
bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
unbind: 只调用一次, 指令与元素解绑时调用。
* w7 l: u, e7 C: |: h
钩子函数参数钩子函数的参数有:
- 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 }。, a4 X& m5 c- m3 v3 F7 N% ]
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
, a7 e4 H: _ u4 c3 h
以下实例演示了这些参数的使用:
实例& |; o5 {( A8 V5 K
: [: u% I3 t* ?0 V- <div id="app" v-runoob:hello.a.b="message">
/ q* e1 D* B. I+ B- q, x' T+ b - </div>
: ?( u2 L( p4 {' K0 [ -
9 t( g' W1 O) p - <script>
k1 F. ?) [, q: [; z" O - Vue.directive('runoob', {7 G$ s( p0 i2 ]5 B' Z7 K" e
- bind: function (el, binding, vnode) {% G6 ` j) a6 I8 w/ f
- var s = JSON.stringify* p" v1 W4 I/ Q: {6 v; ?" H: v F/ j
- el.innerHTML =6 H0 B' a/ z& l5 y0 s# P b- D7 j6 K0 f
- 'name: ' + s(binding.name) + '<br>' +$ J$ `" {$ g X8 }
- 'value: ' + s(binding.value) + '<br>' +
`4 P* y& p6 _0 M5 x9 X( k R8 U - 'expression: ' + s(binding.expression) + '<br>' +
. R z, ?: a( P5 J - 'argument: ' + s(binding.arg) + '<br>' +) n, y# k' D4 x5 a: z
- 'modifiers: ' + s(binding.modifiers) + '<br>' +* L9 T; P/ W' `' @0 l$ J, s
- 'vnode keys: ' + Object.keys(vnode).join(', ')
" [ t z& u- }% G& T - }- E* @' H( t) b6 K7 d
- })
) n. j$ k9 z; h9 ]& s: O e7 S* p! q7 L - new Vue({; k6 l' t, V/ z+ l8 o$ G
- el: '#app',- i3 ]9 o2 E0 M0 F
- data: {1 m7 I; `) g7 k4 ?' u, B
- message: '菜鸟教程!'
5 f9 L: e7 m, {; g - }
* C" }- q' {9 s1 h - })0 s; F& |$ [: E3 Y
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:/ w$ ~# v; T, @: f0 Q7 a l `
- Vue.directive('runoob', function (el, binding) {8 f A5 O, D, f1 ~
- // 设置指令的背景颜色6 M. a; t3 r' E/ j+ {
- el.style.backgroundColor = binding.value.color
0 k4 c, X# x1 g3 B# ?; y - })
复制代码
1 |* D3 X( X( v( m2 c+ b8 W4 r" ~( k5 t
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例9 y/ @) C9 c) g( `: `$ I) |
! o9 N. D8 d8 Y) z- <div id="app">
3 j5 r+ e f7 t9 G. O - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div> b4 I5 v( z: e( f5 `) b1 D
- </div>3 p- S) _ `1 ^) ~2 T! D1 g0 b
- " g \$ n0 [; w$ p6 l: `3 J$ `% s Y3 L
- <script>
m& ~; O7 v# b9 L - Vue.directive('runoob', function (el, binding) {, D9 }/ ]; w( D4 B9 n( A
- // 简写方式设置文本及背景颜色: T \ \: v1 |0 n$ s
- el.innerHTML = binding.value.text
" J, I; ~$ L4 p# }% U, Z - el.style.backgroundColor = binding.value.color) p- I: j# N( G! {: N ~- C0 \8 u
- })8 z4 R- n; H8 R0 W! w
- new Vue({
# z) N9 b& t, \9 x7 R - el: '#app'
# R( D( ?* s: S9 y+ j+ D* P& O - })
2 r3 l( A& w+ B/ j - </script>
复制代码 : d- v% B6 y, x! a
' N* f: o7 Y% m+ v! C. [
1 j0 {/ S' E1 P3 s. T7 K
欢迎光临 cncml手绘网 (http://cncml.com/) |
Powered by Discuz! X3.2 |