cncml手绘网
标题: Vue.js 自定义指令 [打印本页]
作者: admin 时间: 2018-7-4 11:36
标题: Vue.js 自定义指令
) S6 O0 }2 M, H5 m0 B: c除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例; q* Z V3 j+ V% { Z1 a( j
0 D1 \1 I1 R4 i( P0 g- <div id="app">
. n' o. p5 D3 L) |9 ], w4 i - <p>页面载入时,input 元素自动获取焦点:</p>
. V; P: v8 c7 K! Y6 L: G( R - <input v-focus>) _& u/ `2 a2 ]5 o7 z; J% \4 c
- </div>
8 I9 F8 U+ J. B5 y' q9 U8 D( V - $ T x+ c) I0 t
- <script>" M( Z. _3 a: w2 e
- // 注册一个全局自定义指令 v-focus# }2 O: U' k9 A1 h
- Vue.directive('focus', {
$ ~3 u: }2 c0 q* G - // 当绑定元素插入到 DOM 中。
# |. x: j/ D* r8 H0 Q% G9 ^ - inserted: function (el) {% o" |" D" w/ v# S. _! S& g
- // 聚焦元素8 n5 `1 ?3 a. N6 G n) N6 m# B
- el.focus()
0 \+ |* k) s0 Y! E5 Q! ^7 J - }: W$ I4 R" E3 u8 q* K- f
- })# u% I! }& @+ j( K4 g, n( q
- // 创建根实例& {* v+ w% b2 Z7 I
- new Vue({
: f7 y3 @1 H3 d - el: '#app'
. Q4 o( q$ N7 g5 V; Y/ ] - })
7 e3 @7 l& N! \* U - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例& d9 f5 P& ` b! }6 e
# Y5 Y! E/ a F/ C9 {: q* O% F' z- <div id="app">- t; f" O- E' D. B! `
- <p>页面载入时,input 元素自动获取焦点:</p>3 m# N9 \. B# M3 y7 A
- <input v-focus>
% ^5 V# h5 R* ] - </div>, F( c1 J- J, U. a
-
3 Y# h1 Q7 b4 f& i0 J* R4 n6 b - <script>
- K+ x& o7 t/ _/ B$ k- ? - // 创建根实例
- z3 f" `6 f9 c& Z, ]0 h - new Vue({
$ W5 t: l- ]& k; T - el: '#app',, K1 z8 F6 ]' r$ |& v V |$ b
- directives: {
$ _ Y! Q7 f' Q - // 注册一个局部的自定义指令 v-focus" r# s/ z9 V' j U2 Z
- focus: {4 p2 X# ^3 B% Y% ]2 H, y& V; {1 ~
- // 指令的定义+ j& i$ |, ~6 g# Z) A1 x
- inserted: function (el) {" M+ K+ @( _' K% A3 {# `
- // 聚焦元素) e5 I, w- g: |) m
- el.focus()( \. }$ x' V5 a' u# m2 i
- }
5 \4 `! B I$ f, k, ?: ` - }
7 ` r2 `6 b; c+ T8 O4 W- ` - }3 \" i1 w8 k6 X7 i( R
- })
# Q" c* \) F0 e; \& \ - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选):
bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
unbind: 只调用一次, 指令与元素解绑时调用。
9 W* B, x( R+ L& ~6 T; F) B8 w
钩子函数参数钩子函数的参数有:
- 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 }。& I$ g5 p. _/ o2 N4 y0 r
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。, G8 k6 E; t- Q9 ^
以下实例演示了这些参数的使用:
实例
( H7 H0 ^' G8 @+ v; W) B7 ~- C5 k- M* o, b5 g# k3 ?: Q7 x$ r2 s
- <div id="app" v-runoob:hello.a.b="message">
" M4 R2 ]4 F, Y: ], e" A; Z - </div>8 d- c; Q) Y1 D) N
- # j0 q! S3 \, ?# r2 M$ U9 b
- <script>
- R" K( { }# ]3 D - Vue.directive('runoob', {
0 t. w' Z- D2 O* j# m) ~# E - bind: function (el, binding, vnode) {4 F. x! G3 c' ^5 K$ h
- var s = JSON.stringify
3 P% X- C' ^1 [" ? - el.innerHTML =
* i0 _) G6 D, q5 T - 'name: ' + s(binding.name) + '<br>' +# M- `; b2 _2 X* ? l3 `2 k; B
- 'value: ' + s(binding.value) + '<br>' +
2 D, ?) ~6 I* l - 'expression: ' + s(binding.expression) + '<br>' +. ?5 t+ a# x7 h& P
- 'argument: ' + s(binding.arg) + '<br>' +
- J; T8 B7 E" V9 d - 'modifiers: ' + s(binding.modifiers) + '<br>' +! j7 `+ i* W! |* g% M/ j/ q, d
- 'vnode keys: ' + Object.keys(vnode).join(', '), {$ _# V0 e% x z
- }
1 K$ ~- o7 L$ ]! r/ o - })! d" H* z. A* }
- new Vue({
% C, }. G5 T5 [ - el: '#app',
u. R1 S/ a3 l% Q' M _ - data: {# H$ Z6 F S; a- m9 p) L. K( _3 G- H/ q+ q
- message: '菜鸟教程!'* s' Z3 h* ?8 w& a s
- }
1 L. O. G5 R. Z$ C' H2 T - })0 O" V+ ?0 P( D$ I d3 g
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
: x9 `. |4 T* Q. ^( c- Vue.directive('runoob', function (el, binding) {; Z1 e! k, `& l
- // 设置指令的背景颜色/ }1 z/ l" p& \8 Z4 I% P
- el.style.backgroundColor = binding.value.color
$ d2 @$ r9 J2 w4 x- a - })
复制代码 3 O- O( y5 F5 [7 l7 Z
6 f$ i" d" q7 `" |. O+ V1 Q, {( e指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例, W! ]% D3 [ w/ {, z8 P
/ h+ a1 a" Y4 c$ _1 }+ T4 J
- <div id="app">
- W. g; c ^) p! c, R) s# A8 L7 @ - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
1 ?, o# _- h. f! A" N - </div>
6 R* e2 Z' j4 k! |. q" O: n: N -
! L9 O1 G4 s; ^ _ - <script>
2 G( K$ \" l+ w# A7 U, C - Vue.directive('runoob', function (el, binding) {+ \8 n% Y" i( ^# k1 q/ z% g
- // 简写方式设置文本及背景颜色
) o- z3 H, r2 k. x |3 D. ~( V - el.innerHTML = binding.value.text3 V1 W6 X/ w3 O! a' \8 u
- el.style.backgroundColor = binding.value.color
$ S7 f$ X l: d - })3 L8 X7 {( o$ k) e2 a* k
- new Vue({
+ C/ `1 {! n. e - el: '#app'- x: ?/ e7 k% n5 _" ]! }
- })% t6 \. ^2 K7 L# {
- </script>
复制代码 * Y$ Y. {% J! R* ^
5 A* ?2 A5 I) u) H. g
% y, ~8 R* a9 H% \5 y4 e' W
欢迎光临 cncml手绘网 (http://cncml.com/) |
Powered by Discuz! X3.2 |