您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15486|回复: 0
打印 上一主题 下一主题

[Vue.js] Vue.js 自定义指令

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
+ d8 F% l; E, c1 z' [
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例% R, U; H% j, S
; }% H. [2 T2 z* _, j
  1. <div id="app">
    3 u; D" e+ u$ r: G6 _8 _; Q
  2.     <p>页面载入时,input 元素自动获取焦点:</p>+ `/ R) \3 c1 K$ e4 |9 i
  3.     <input v-focus>& c. R# z" L3 R5 \7 p! O2 f9 m
  4. </div>
    . {: F2 Q2 z3 X) h' Q
  5. 3 e2 k/ R$ h* B
  6. <script>8 V( j& K% k# r& l1 ?; K8 e
  7. // 注册一个全局自定义指令 v-focus! t* p& }  n! Z
  8. Vue.directive('focus', {
    & q& I/ O3 e7 b/ b! E# X4 N0 R
  9.   // 当绑定元素插入到 DOM 中。, I$ K* F  }3 J9 }# h- a
  10.   inserted: function (el) {3 k$ u! p* L2 w# f3 c- M
  11.     // 聚焦元素' u: O! e  A3 V
  12.     el.focus()) I! x* z' S. J9 ~  S# M6 Y
  13.   }
    0 `5 y0 }6 ~4 B% D4 ?( I$ D% n
  14. })
    7 o) G1 g: X8 p8 l9 m
  15. // 创建根实例2 N) @/ l$ @& M7 h9 f3 b
  16. new Vue({/ {1 a* }; `. ]" |1 ~) |* P; p) j
  17.   el: '#app'
    3 I8 K9 Z  f- y- H9 j% y
  18. }). L$ L5 _3 ^$ k' [9 w
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
+ a$ B* Y9 o2 G9 T$ ^" a8 X/ G% z  V  w2 v" C$ }6 M1 F
  1. <div id="app">8 G( W, U1 O+ R
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    . ]) U4 ?1 Z" A
  3.   <input v-focus>9 W) Y- U6 Z4 \+ z+ v# s
  4. </div>
    6 V! c# J8 ~6 T

  5. 7 ~6 n& H9 C9 j( V
  6. <script>
    ! q& H; t6 @* }# N4 r7 J
  7. // 创建根实例
    1 X( ~4 G1 R+ F. K  {' X- o9 e
  8. new Vue({
    ! a( R; ]8 h  p  |8 j8 i( L
  9.   el: '#app',
    ' b9 c( a4 C6 q. x% ?* b
  10.   directives: {
    - p1 q  Y$ Q6 T/ `1 x# b4 q
  11.     // 注册一个局部的自定义指令 v-focus! l( J# W& H/ ]  T7 G+ T' y$ c: P
  12.     focus: {6 t: M( `1 f0 F* T: P
  13.       // 指令的定义
    5 f- X: z: {* G( u. H  n. y% v2 u
  14.       inserted: function (el) {, p* _/ J6 M( o4 z4 A
  15.         // 聚焦元素
    * ]; s! z4 [4 E* r
  16.         el.focus()
    & f9 l9 K( A- n& z
  17.       }3 j% d8 d; P: N5 h; A1 t
  18.     }, [& r: e# a, Q" v3 @* `
  19.   }
    , b0 ~0 l' }2 e) ]. u% F4 P
  20. })
    5 S$ U8 Q6 Q% }: d
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    1 {( m* w3 u' ], 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 }。$ Z' ?) Y& F9 }# `% n4 q& ]
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。+ Q1 |& F6 L. Q) D3 k5 ~! {: R
以下实例演示了这些参数的使用:
实例+ ^. F; X. e; d' m) W
" K+ a2 J5 F; ]2 u% r0 K# [
  1. <div id="app"  v-runoob:hello.a.b="message">
    4 k0 C2 k1 B! P7 `/ z
  2. </div>
    5 A/ S8 O5 z9 {$ t+ b, m% E* \

  3. % m  _7 @) Q) i6 }* z1 T
  4. <script>  e+ d" b- L6 ?6 s) D  y* @6 n
  5. Vue.directive('runoob', {
    $ |! Q& J. q" |6 \; x$ E
  6.   bind: function (el, binding, vnode) {  l, I9 \. @, B4 N
  7.     var s = JSON.stringify
    ) }% B6 D# j$ B% m* Z
  8.     el.innerHTML =
    , s( j0 Q4 C# p/ s: T4 C8 @
  9.       'name: '       + s(binding.name) + '<br>' +! s# I; }# J- L- v) E, x" K
  10.       'value: '      + s(binding.value) + '<br>' +6 B7 S" l% |. A
  11.       'expression: ' + s(binding.expression) + '<br>' +
    , b2 U  v. M& O( z$ K1 N1 f' f
  12.       'argument: '   + s(binding.arg) + '<br>' +0 D1 f) `( p+ s. }
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +3 U1 N6 {4 q' w6 c* b8 H+ J7 j
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    / b- p0 C- ?6 B: \$ T
  15.   }
      w/ b+ ?1 f) ?/ K
  16. })
    - }. \6 V& D% t. L  i; d
  17. new Vue({/ N) O8 c( X6 @4 i/ Z! a
  18.   el: '#app',
    5 N$ x! P, X% q1 [& s' ~6 b$ E
  19.   data: {
    ) v+ e2 N9 ^+ x- F2 G
  20.     message: '菜鸟教程!'4 H6 V6 x" H7 k' j1 a. U. e8 q1 m
  21.   }3 S$ }* J/ l  R4 y/ C
  22. })
    5 K3 V5 k" V/ f* K) r
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
% J# A* n9 ?( T* r" {/ ^
  1. Vue.directive('runoob', function (el, binding) {
    : o- [/ W( f  j; a2 y) G& W+ \) w
  2.   // 设置指令的背景颜色0 ?0 t8 M# ?- u- E
  3.   el.style.backgroundColor = binding.value.color
    ! L4 [; {5 }$ k, A
  4. })
复制代码
0 K+ x7 w+ I: }' I! q
( m1 |' E* G, e& N, ]* S8 }
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
# @% n/ G" Q9 K2 f( a1 N6 t
* C+ M/ h) f1 J, m) o: O
  1. <div id="app">- r/ `8 u# L0 ?; r% i5 R7 P
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>) u2 c* i% ^0 B
  3. </div>
    . H8 q! ?$ C3 m. N

  4. " q2 Q4 i' S5 p: e9 s% @( M
  5. <script>
    8 M: k1 e( o2 [$ E
  6. Vue.directive('runoob', function (el, binding) {1 G  B( X* }! h6 z
  7.     // 简写方式设置文本及背景颜色9 b6 R  I4 ?: ]/ r/ y( J
  8.     el.innerHTML = binding.value.text
    : M# Y$ i4 `+ @" E9 @
  9.     el.style.backgroundColor = binding.value.color
    5 V9 C1 S( g( T5 T' {) g
  10. })
    9 b4 c8 J; u6 ]0 H" _& j
  11. new Vue({
    . X  @7 I. |2 M+ \
  12.   el: '#app'- H2 b6 C# j$ t1 I2 M$ m6 Q- a
  13. })
    ) Z, K  ^% o. C- b% r/ O: t
  14. </script>
复制代码
* U5 I* p5 G$ v! X8 m" w

" I+ y6 g$ q. S& `
: l/ f- v: p: R" r9 @* s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 18:10 , Processed in 0.078277 second(s), 19 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!