cncml手绘网
标题: Vue.js 自定义指令 [打印本页]
作者: admin 时间: 2018-7-4 11:36
标题: Vue.js 自定义指令
& z# d3 x, C I1 h. U6 a; f1 }% s除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
& c. b7 f( |- u: _0 k
. L6 x. ? G/ O% l- <div id="app">/ n8 V; G( {& u- z" ] u3 S% f6 E
- <p>页面载入时,input 元素自动获取焦点:</p>' ? m5 P2 w- b% x. V/ P
- <input v-focus>
6 ]! X* ]2 j' g; ~ - </div>* x* v* o7 k, Z4 R) r1 q
- ' l( N- z2 V+ n# s1 g
- <script>
) b+ ^% \4 E8 V- Y - // 注册一个全局自定义指令 v-focus" E) B% r. z ]+ l! V/ i! k4 Q# J
- Vue.directive('focus', {! w- r3 b7 c1 W( \
- // 当绑定元素插入到 DOM 中。1 r) `" E' ^6 t' _ C
- inserted: function (el) {4 p4 E# U5 j. T1 A8 ~' b( k
- // 聚焦元素
- G; Y3 d T; g0 u, v7 L' G - el.focus()
( }* y4 y7 P8 @ - } D/ t! z* ?. u. i# I* N9 |$ o
- })
9 z; ~1 o. D4 u; _ - // 创建根实例
( l( V3 J# _# K# O6 d - new Vue({
; M; R k l* d' Q - el: '#app'
1 T7 n9 E+ ~- G3 o" C4 q - })
7 L6 }1 O% M( R - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
- Y( d) U Y/ J$ c0 _- y& {4 H, s7 Z. d4 E5 m: i% P. c9 h
- <div id="app">* v9 ~8 Y5 L* N4 O& W9 Q! u- h
- <p>页面载入时,input 元素自动获取焦点:</p>
6 l: _% s6 D% z T0 k9 k1 V) K - <input v-focus>
! E$ t: q: K1 }. l7 y" G7 X# m - </div>+ m& o6 z' G/ a1 F6 i
-
1 t: b# N5 P8 x3 E* Z( X: i& L - <script>
, s2 ?( O+ P7 y$ T - // 创建根实例
2 W2 J2 ~3 V' ^3 B6 d3 j9 g! \ - new Vue({
' i. m# a& i# u, }) F$ s - el: '#app',
t+ t& s& c' Z1 J) D3 f - directives: {
! g! {' f3 V B; V0 a8 X - // 注册一个局部的自定义指令 v-focus
' k- j6 R; v& O6 q# m( F2 J - focus: {7 r+ e: B4 [! s+ [4 `
- // 指令的定义
. p; b: J+ C8 W - inserted: function (el) {
5 U, u& [6 u! b6 a5 x* F - // 聚焦元素
1 @# ~& P3 O% ^" u - el.focus()% t) b! ?2 }1 I& ~; O M% h
- }1 p# v8 O# [$ j5 V* {
- }* e8 z3 i$ U$ [
- }( e; H9 q8 o9 A% t, w
- })& Q, n& `9 R, r: ]3 @% T
- </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选):
bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
unbind: 只调用一次, 指令与元素解绑时调用。
" I( G8 ^* G5 k& 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 }。
( r3 `: H/ q; Z# S0 h5 q% S# d
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
' b6 L1 {& w' Q& a/ x8 K x
以下实例演示了这些参数的使用:
实例
1 t! {) ^ r. B9 V8 x7 G* T% \' y4 G. N, `5 ~% i* k
- <div id="app" v-runoob:hello.a.b="message">
~- ~9 _8 l$ S' z3 O$ I - </div>2 u* O/ p3 X' k" q9 e) n# g+ x, F' v
- 3 A7 l6 Z* Z' R' e/ A
- <script>
; @2 |# y7 E# J/ |/ Q - Vue.directive('runoob', {
4 i( b% t7 c7 T6 Q2 k t8 D% w& m - bind: function (el, binding, vnode) {
; `8 M z3 o3 i7 b7 h h+ c - var s = JSON.stringify
/ ?5 f$ ^' T, m+ c; i - el.innerHTML =
( T5 Q! n9 N1 G+ d: O. W - 'name: ' + s(binding.name) + '<br>' +, X8 J7 P0 b- k6 i& R' T' Q
- 'value: ' + s(binding.value) + '<br>' +
3 \; \/ X3 o4 G - 'expression: ' + s(binding.expression) + '<br>' ++ S+ {2 t$ K5 h2 c }5 `
- 'argument: ' + s(binding.arg) + '<br>' +
- S- X v& v; Q. e- d& [" | - 'modifiers: ' + s(binding.modifiers) + '<br>' +# V! w) U. B* Z& _
- 'vnode keys: ' + Object.keys(vnode).join(', ')
7 I2 d: o7 y+ h( ? - }) l" E6 }: J, ~& i$ o/ ]
- })
) j9 u% `4 j4 Y, @# X - new Vue({
* V8 F3 [& u* V9 F - el: '#app',1 Y; b" H" U6 M* d
- data: {# Y: H4 h# k7 c% b+ W7 {6 A
- message: '菜鸟教程!'3 ~1 b4 T' c& @' M
- }3 {# z/ |( t& j4 d
- })
3 I C4 t: }$ U* s! y0 b - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:6 l7 c' C; Z; l/ y* i' M
- Vue.directive('runoob', function (el, binding) {0 b( i. ^ V4 R+ I. c. w* _
- // 设置指令的背景颜色
8 Y; X" M. D/ w" U - el.style.backgroundColor = binding.value.color ^0 w# y4 D V! p+ a6 v) ?, E
- })
复制代码 # m! _3 c b7 s0 U# l
1 z4 H& l! m- \! ~( M
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
. s7 V2 p9 v+ b2 ~5 ~$ f. \! A. g+ Z" o; E4 }! w3 ~% @& S
- <div id="app">6 {: i9 h0 x- X- N
- <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>3 P5 v: ]& q* @* |: a( Q
- </div>: Q T1 C7 a: W0 _+ Q
- 6 I1 l8 F. x3 r+ x
- <script>
7 P4 H& E2 Y' }' d3 v5 t Z - Vue.directive('runoob', function (el, binding) {# g: z2 ?2 N0 w
- // 简写方式设置文本及背景颜色
. m; V( N) O2 w% g - el.innerHTML = binding.value.text4 p2 T# m, Z& g- ]1 b' \
- el.style.backgroundColor = binding.value.color
% r3 Y( |! @2 X7 F0 p: R5 u - })
0 X) y; V9 X+ F8 b6 K3 K5 r( _ - new Vue({
, p7 }; F6 F3 j; d! f+ Y% W - el: '#app'( v2 e& h; u' w% H
- })
$ Y8 R5 g1 ^, Y$ | - </script>
复制代码 7 h8 q5 Z N ~+ d' A
* n1 @7 L) d( J5 x! f1 g
" N& t) l+ s* l
| 欢迎光临 cncml手绘网 (http://www.cncml.com/) |
Powered by Discuz! X3.2 |