cncml手绘网
标题: Vue.js 自定义指令 [打印本页]
作者: admin 时间: 2018-7-4 11:36
标题: Vue.js 自定义指令
. m. _5 j- S3 d5 i6 C
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
$ E8 @; X, u, D3 |. V2 a
6 R* O/ M' ?1 _: J7 v1 D* y- <div id="app"> X, J: \! }) y J% u7 P" d0 k
- <p>页面载入时,input 元素自动获取焦点:</p>: l* h& d5 s; H) C! E
- <input v-focus>
# ?( }& C+ A8 C8 t' q1 [ - </div>
' V3 j& {: [7 ~8 B6 J -
3 C* O% p- r* a& h, f4 l6 j- S - <script>
o/ T: W( B1 z) c - // 注册一个全局自定义指令 v-focus
0 c5 a5 J0 J& Y& `+ _- Z - Vue.directive('focus', {* @7 K: J U O8 ?9 k
- // 当绑定元素插入到 DOM 中。
- @5 B. | v( e% Y6 K - inserted: function (el) {) G" R; k" i4 F d2 |. K" _
- // 聚焦元素
N5 c' g* T3 g/ S - el.focus()
) M& c* Y! I6 O2 K* N: b - }0 d* k/ U& r+ f7 V, J
- }); K; T3 Y, V, }8 ^' q1 Z% m; \( g
- // 创建根实例
, x8 K* A4 t( k4 g( F2 \. ]# o - new Vue({1 }( ]( z r# G& Q4 n
- el: '#app'# h$ | p! \; l) Y9 g, A( `/ H
- })
1 q- H1 Q- B4 A4 M2 T5 q - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
8 w5 f0 D ~7 H+ S! ?9 d& y+ v! E. E( p/ v$ }, |; w" w( i3 i
- <div id="app">: S z2 b# {: d! [" H: T% u
- <p>页面载入时,input 元素自动获取焦点:</p>
* O' h! S% Q& \: e - <input v-focus>
" u, ] @+ N9 L' W ]* H$ b - </div>
5 B( B/ X$ d8 ~# a - 9 F1 F4 D C) _* R9 N4 W8 \
- <script>
/ R- {( h) W4 m& I0 p; n/ v - // 创建根实例
; n4 J' D$ E0 m- H. z7 z0 T - new Vue({
& r% i7 ~( a7 C8 c! H# H1 K - el: '#app',
$ c' u' X" m8 }6 V/ ?1 d4 G - directives: {# x9 n4 x# O4 A& y1 H
- // 注册一个局部的自定义指令 v-focus3 D* G, m2 s- f. X' T* {
- focus: {( N {* H8 _& M0 A: A9 C
- // 指令的定义% h6 d r0 b7 S! `4 A
- inserted: function (el) {1 n* Q* a; c7 O
- // 聚焦元素
9 N( A' o/ a2 M+ }/ n7 A - el.focus()
! k$ C e7 l; f Y* \ - }
" A2 k4 s3 \3 X3 k- c - }& U3 t6 a& J5 Y9 h; K3 e/ K. B' m
- }
. f4 w" |8 U6 {. A( Z3 i* Z - })
+ g5 ?0 P8 H& C; O$ V8 t3 J - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选):
bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
unbind: 只调用一次, 指令与元素解绑时调用。
! L, s3 ]" C0 s* o0 j$ a
钩子函数参数钩子函数的参数有:
- 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 }。; q# r) ~+ a% V+ ^, W+ O( s: E
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。! D: ?# g/ I: Y. X
以下实例演示了这些参数的使用:
实例
8 m7 w% H" G8 I7 S/ F/ T
# @8 a: ?) k! K0 o- <div id="app" v-runoob:hello.a.b="message">3 b" `7 w: m m2 N/ i! l& |
- </div>
' N% b" {# x( i$ @ - / b5 f" Z2 V8 z/ S# u& ^
- <script>
8 Z( P2 F/ _2 P; P4 H - Vue.directive('runoob', {: Z6 H9 r+ H! d6 I8 t
- bind: function (el, binding, vnode) {
, Q" @, q! ]- } - var s = JSON.stringify; Q% J1 X1 o `: }7 U
- el.innerHTML =
; {0 ]- y! w: [ - 'name: ' + s(binding.name) + '<br>' +
# o1 @3 L, n) f5 z" O: W' O - 'value: ' + s(binding.value) + '<br>' +% `2 J3 ]- q( L; I) b0 N
- 'expression: ' + s(binding.expression) + '<br>' +
$ r! m. @. r) G5 l" m9 F$ z - 'argument: ' + s(binding.arg) + '<br>' +
4 P3 B, Y; W+ X: D } - 'modifiers: ' + s(binding.modifiers) + '<br>' +
0 |4 c: q% d2 d9 ] - 'vnode keys: ' + Object.keys(vnode).join(', ') L9 r2 H5 [3 F9 x4 P: L
- }, w9 v; E; b: f! e5 c
- })
" {) h* Y# i4 H - new Vue({
+ p3 J( V- i" E7 ` u - el: '#app',
$ c( P! i, z I1 Z - data: {
0 x) U- F! r5 f - message: '菜鸟教程!'
7 j& Q S3 m3 s! x7 U1 a8 G - }
( C4 b3 c& V% f$ M$ p( S, N) q# Z - })
4 G; Q! Y% w1 ~1 j - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:$ d; X6 W _' l1 v2 W& D3 }. e. u
- Vue.directive('runoob', function (el, binding) {0 h) C s, I/ o, _6 }3 ?. _
- // 设置指令的背景颜色' N+ i1 i6 J7 n2 F3 u2 g6 C
- el.style.backgroundColor = binding.value.color. S( Q& E/ x% P
- })
复制代码
# x7 G" }8 x: z- O) P& F, B: l' H/ b
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
. v4 h I4 z. n$ J3 B- s, D- w3 w* m. A
- <div id="app">/ \9 S* b: L8 A" i: C
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
& f& l9 O" [$ M2 Z8 g/ m - </div>7 ]! y1 i5 C5 V1 X! z5 V# \, i4 W4 e
-
2 E+ U$ B2 I- ]4 d. o/ z - <script>
: m; i0 Z. \* d+ o! n - Vue.directive('runoob', function (el, binding) {
/ ]; m1 v7 g1 B- H3 G - // 简写方式设置文本及背景颜色7 s; @8 @" @8 s% v
- el.innerHTML = binding.value.text
6 ?/ _& T C$ M9 d# t! e, L/ n( a* F - el.style.backgroundColor = binding.value.color' @2 O- m9 N: f1 y( I; ^: O1 `% B7 c
- }). E- |! ]; t D$ ~/ ~8 z/ g7 J; ?
- new Vue({0 i7 `% r- B7 y& P8 N
- el: '#app'
2 V: P: ]( [9 q4 F - })& o0 K* d; n, B p Q
- </script>
复制代码 ; A" ]) N, \" ^1 H" ] k
( L# t }8 n4 P, {' V, U! G, ^: \
2 h7 x& s/ G( k
| 欢迎光临 cncml手绘网 (http://bbs.cncml.com/) |
Powered by Discuz! X3.2 |