cncml手绘网
标题: Vue.js 自定义指令 [打印本页]
作者: admin 时间: 2018-7-4 11:36
标题: Vue.js 自定义指令
; v. T9 C' ~( M* @' d% v
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例# B$ O; ?0 ]1 f5 z: J: m
8 q+ `8 I& K7 J0 `9 c% Z# H- <div id="app">, o7 ^5 A q+ Z9 P7 ^+ D
- <p>页面载入时,input 元素自动获取焦点:</p>
* N& Z) g6 b( e* `, M - <input v-focus>( L3 N* t" S" T; E
- </div>
% g4 `: u9 T: ^; w) {7 C -
& o, j& ]( c, G( M2 d! _ - <script>
/ U; i' G7 E3 L - // 注册一个全局自定义指令 v-focus
& f( d* {% Q$ h$ G8 I - Vue.directive('focus', {
) A4 y2 H, h$ M$ V0 D1 U - // 当绑定元素插入到 DOM 中。: N% E, b" r3 V3 w
- inserted: function (el) {
2 [; ^( u* }- C; x' M* X6 O - // 聚焦元素6 [8 w" r1 h. X- u5 L
- el.focus()
6 e* `+ L0 h9 c, A' G7 s - }5 M4 i3 T' k4 e/ s% y' D6 P, ]
- })
% X1 I; l( X' y/ B1 D$ M. r. t - // 创建根实例/ X8 ^4 F m+ X- K0 f: p$ o
- new Vue({7 m0 d \. Y1 q! M
- el: '#app'
! {0 X) X0 q3 a7 C( O - })7 t" z. x% B2 q8 R. I3 R2 m4 _, T
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例/ A; b, [9 Q {8 x
% G ]2 @+ U8 X! w3 C( X# a- <div id="app">
: R3 D* i2 _# z$ ?/ `. ~' N i - <p>页面载入时,input 元素自动获取焦点:</p>/ q+ U1 c3 d9 @6 V" z
- <input v-focus>
# d" i0 ]/ c; x+ d4 R% W9 x2 a7 ? - </div>
+ [5 e2 X1 t; e+ e1 O8 h" T% [ - ' O$ B1 C/ m5 w+ `0 M0 M
- <script>
% i! F3 ^% J: F- ~; r1 R7 e" e- m - // 创建根实例
8 l8 Y/ }+ l0 @& P0 [ - new Vue({
/ L6 ]& G5 I R7 O# ~1 p - el: '#app',$ C- ] D9 ] U( I7 W+ b
- directives: {7 Q. U* i8 f; x: R2 e
- // 注册一个局部的自定义指令 v-focus4 [5 }: c/ T) G1 Q
- focus: {
V6 [3 Y; a2 w% ]: c6 ?# u0 P! t3 ~ - // 指令的定义$ {% h6 u: D3 [) B5 ~2 [
- inserted: function (el) {# L! A- L2 D. K2 H3 m0 g
- // 聚焦元素
% c! v4 l- B+ A, m4 X - el.focus()
& H' h$ Y7 ]* s1 O; W( [8 z - }5 Q* l" o) P4 b
- }% f& O( S! P$ m! K- p2 J& n$ e
- }; E% y; h% _* }. d
- })$ A/ o7 h7 @4 t5 F# V8 `
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选):
bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
unbind: 只调用一次, 指令与元素解绑时调用。
; E4 n. O$ M& z
钩子函数参数钩子函数的参数有:
- 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 }。# A" G! `! |9 b% W4 E ~/ L9 n
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
+ Z* @6 z, v9 U! H
以下实例演示了这些参数的使用:
实例
8 [& v1 t6 K5 Z0 }/ f+ h
5 N4 _; J: c. G- <div id="app" v-runoob:hello.a.b="message">
# m( R: M- X* v& X- Y, l1 Z4 [( U3 }$ q - </div>
( y; G$ B* S. g( [$ h$ M' ]. Q% ? -
8 B, w! F. N- }' [ - <script>! L! R, ` K3 k3 V: \+ p
- Vue.directive('runoob', {% y+ m4 g8 y; M# v
- bind: function (el, binding, vnode) {) A5 D$ R+ S. J, ~$ M! J! b
- var s = JSON.stringify
/ n" O# ?5 m, D _% a) {6 y - el.innerHTML =* ~% g) G% q: ]- q1 E) {
- 'name: ' + s(binding.name) + '<br>' +
$ w2 s: I, s6 ]% Q - 'value: ' + s(binding.value) + '<br>' +, D+ @1 y3 l" } P8 i
- 'expression: ' + s(binding.expression) + '<br>' +8 f8 ]& ]8 @9 _( F$ i$ r
- 'argument: ' + s(binding.arg) + '<br>' +
8 {' F4 c T* C - 'modifiers: ' + s(binding.modifiers) + '<br>' +3 k6 w) E5 V5 g
- 'vnode keys: ' + Object.keys(vnode).join(', ')/ I m% t% s2 k i$ f: f3 y/ }6 b
- }
7 j4 A* F7 |" M8 Q - })
/ y8 d- j, L8 Z1 X2 \" y7 s2 A - new Vue({
: l' d, H9 w) A+ x' @6 E - el: '#app',
L6 y, c3 B; s' |+ P - data: {
0 M! Q7 Z* E2 ^ - message: '菜鸟教程!'
: o5 R/ n3 Z- I - }
8 i; y/ @; A) m3 ^' ? - })
. W+ |$ u, l0 B) y - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:' j8 n2 [, Z* h. J3 }
- Vue.directive('runoob', function (el, binding) { o2 k4 f& t& s) @/ A% n9 v) Y
- // 设置指令的背景颜色
$ ~$ }8 G1 I- m' s# n, k' Q - el.style.backgroundColor = binding.value.color4 I* O6 [, K6 E
- })
复制代码
* ?0 n& ?( A, n
! s. m' I9 a/ J0 F' A指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
/ I9 b3 ^3 M, o3 Z4 s! J1 L# S1 s3 [+ ~
- <div id="app">& G; b2 \. j# J6 f" \! Z& \
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>! X, A2 {1 l0 {: L0 O& s$ N/ S
- </div>" O) H8 {& t% {! S: z* V2 t
- ( P" p; `4 u( {5 _
- <script>& ]6 r* V4 g* ~( \
- Vue.directive('runoob', function (el, binding) {5 Y: ~0 n A/ |, T9 H
- // 简写方式设置文本及背景颜色# C( @- q. t, R/ N
- el.innerHTML = binding.value.text
! u: ~! |! f2 @$ K/ `; t# I - el.style.backgroundColor = binding.value.color% }+ E5 U. t1 j8 T
- })" e* ?' s* Z/ ^( e
- new Vue({. b& x6 A" n4 A9 H, s5 I
- el: '#app' F6 [ f# _9 r; B$ G
- })0 r4 u9 v% q7 C6 }, H
- </script>
复制代码
6 s, {- L% g( W' J8 A7 _2 @2 y4 e" I! ]
" Z! [5 d: x( Y- y# d
; n3 L, a; O3 L1 X/ x; w9 l
欢迎光临 cncml手绘网 (http://bbs.cncml.com/) |
Powered by Discuz! X3.2 |