cncml手绘网
标题: Vue.js 自定义指令 [打印本页]
作者: admin 时间: 2018-7-4 11:36
标题: Vue.js 自定义指令
* ]3 l7 X }5 q" e2 {( M* d8 A
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
" {/ | p: D1 v3 K! `' k6 u) Z! {* b% @1 w
- <div id="app">0 t# U5 o- X! `/ j7 _5 X3 T
- <p>页面载入时,input 元素自动获取焦点:</p>
6 ^$ F& C, @3 W, E - <input v-focus>
! b. m/ X+ J0 i* o; X; T - </div>
5 B- e: Z ]% C9 v0 i+ u8 a# g0 z - 1 N, y w. m! _( Q! y3 j0 Y8 i2 e o
- <script>, g$ N# h# R& z' ^; r
- // 注册一个全局自定义指令 v-focus
R' g9 y. I g d$ R - Vue.directive('focus', {
) u2 O y$ n3 J. W - // 当绑定元素插入到 DOM 中。) W, H/ L7 t- m
- inserted: function (el) {4 p) S% B9 P" Q, b
- // 聚焦元素% ] T: A# m* M: F2 z
- el.focus()
8 W" u' k0 p. r U - }! _( }+ D2 ^6 k
- })
4 x' H7 d; ?& W% n( t - // 创建根实例( T# P$ N3 N" @! K1 X0 }( U$ i
- new Vue({
6 t8 E5 Z b e; N& H - el: '#app'/ s# g8 f7 F/ E
- })$ b* N% |' `+ _# p
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例& v! j) A5 O) x, h
% X Q4 R' }4 ]* H8 C6 ]- <div id="app">8 D' M& ?# w7 a# ^1 n; q0 {
- <p>页面载入时,input 元素自动获取焦点:</p>
2 \% o# Q7 G3 g- Y {5 O/ J - <input v-focus>
) v# p( H: p! [ - </div>; e9 `( _- `' H, E6 L" l4 {, I. w
- . P) p4 G5 p; N9 T9 x
- <script>
# _ X1 a5 t n R: S( _8 S9 B9 } o - // 创建根实例7 E9 S% x6 c8 ?$ k2 s2 N
- new Vue({
* ]. L0 y! O- n - el: '#app',
/ d! ^6 j& S/ i - directives: {
1 r9 o- [- r1 u: `) c- z' y - // 注册一个局部的自定义指令 v-focus
+ A% R0 i8 C- i8 \- { - focus: {6 F; t! O: e. I: V' i$ D$ t; C
- // 指令的定义4 b" M7 o4 P- Z; D/ w0 {
- inserted: function (el) {
3 [ h" B+ \* [5 w1 ?% J% E - // 聚焦元素7 f. |9 S: E# I* C5 J7 p
- el.focus()
$ E, j: y8 E& f. l5 R - }
' j0 v7 g( `8 w# _! i5 W, v7 t - }
a; }4 C6 x3 B& P6 r - }
; S4 A# y ^& R. G! t y - })
1 z# B! m& l# H8 A" p: J - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选):
bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
unbind: 只调用一次, 指令与元素解绑时调用。
. Y3 u3 \$ y/ ~8 J
钩子函数参数钩子函数的参数有:
- 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 }。$ M9 }; {3 a P# G' F
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
; \9 C+ x) L. R T- {' e7 |
以下实例演示了这些参数的使用:
实例* P% J* h$ L+ q9 h; f
8 U0 h6 M, i2 J6 E/ X4 L& v/ d; V
- <div id="app" v-runoob:hello.a.b="message">2 D' v. S, ~* s* o: U% X" u# L9 U3 g
- </div>
& D, }5 l4 `; c+ d3 d5 \3 t0 i - 2 l+ G* a1 o- Y# n
- <script>
# f, n _1 A1 |+ i9 s: h( x - Vue.directive('runoob', { m) l+ Q( M2 q2 ]
- bind: function (el, binding, vnode) {1 a8 }( w. ~% h; d. ]9 O
- var s = JSON.stringify$ w* T( Q% @ [. R
- el.innerHTML =) R% w& r5 r' J
- 'name: ' + s(binding.name) + '<br>' +
2 F9 w8 z0 t. |( j - 'value: ' + s(binding.value) + '<br>' +
0 y8 T. Q2 {+ ?0 F0 l - 'expression: ' + s(binding.expression) + '<br>' +
/ f! i( c) |3 @% ]! B - 'argument: ' + s(binding.arg) + '<br>' +" k* X% I; k6 t0 K' g
- 'modifiers: ' + s(binding.modifiers) + '<br>' +7 w s! F( s* w8 Q) X9 G
- 'vnode keys: ' + Object.keys(vnode).join(', ')& e% I) s+ i- ^/ F$ X8 Z: N
- }
8 w' T. O# a/ d7 ]' a - }). j% i. Z( J+ h& p) ?
- new Vue({
. s4 V4 n, X) `& w - el: '#app',
2 C8 f8 r9 r8 w# W - data: {
1 ?* z7 V/ f. l( I2 |& B - message: '菜鸟教程!') N6 L" d {$ X4 n J
- }
( H* _4 B' A5 b5 ~& N$ \- d1 R - })2 F3 x8 z$ O$ E7 |- u; W- n
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:- J. r* {# a8 @
- Vue.directive('runoob', function (el, binding) {
3 o+ b: Q$ y5 S" s - // 设置指令的背景颜色
1 E, v. w+ q, n; y8 F' j. M% c - el.style.backgroundColor = binding.value.color% o: @2 c% D3 _) z
- })
复制代码 ; W* C; y- @1 Y
5 f9 @# J2 }: J: T3 C! H" I! }
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
w, S. J$ A" A- {2 i4 s6 l _1 ~( ?6 A" r$ a
- <div id="app">/ C0 m9 @2 f/ g" R( ^! T% Q0 l
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>& e y# M% u+ P) j: Y
- </div>7 c; Z$ ? B" o
-
9 @, |' g! K0 i$ r5 V5 R* [4 `$ e - <script># O( q3 m$ a# m6 J E$ |, b
- Vue.directive('runoob', function (el, binding) {3 n `2 O2 f/ I, q
- // 简写方式设置文本及背景颜色
* @1 u' H* M2 U( I/ p - el.innerHTML = binding.value.text Q$ c: [, r$ w& V0 L4 u" e
- el.style.backgroundColor = binding.value.color3 T1 f8 n! q8 x9 B0 q& C1 ?
- })& D, q6 [4 F( e$ ~, @
- new Vue({3 ~* b$ H! n: i7 d9 X |) D( ~
- el: '#app'" k M- z. V: k: g- ^3 M
- })3 q8 Z8 F" z+ J, A, z
- </script>
复制代码 3 O+ m0 N/ d" K3 W1 ?" g* D& @
+ } U( T [4 N
2 B0 G2 g' v1 x
| 欢迎光临 cncml手绘网 (http://www.cncml.com/) |
Powered by Discuz! X3.2 |