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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

: u& H, q0 J; [
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例- K) }0 @* [) U: `" _& e( ^8 C

6 o; |& b4 E$ @# y8 N; u. e
  1. <div id="app"># k7 y8 ]; P8 a5 v
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    ) e/ A# w& e8 `2 B; J6 [3 W* J
  3.     <input v-focus>2 |, E! H5 P8 _& a6 E& H- ?. I4 X
  4. </div>. C* Q3 O( W5 f7 P. {

  5. " i3 h4 C: Q. j" P2 L" _8 w
  6. <script>" I* s/ b$ O  P( N, E
  7. // 注册一个全局自定义指令 v-focus$ ^7 }$ D9 P0 v9 {  T- z6 W. J
  8. Vue.directive('focus', {* D! `. _' G3 |9 J' W2 X
  9.   // 当绑定元素插入到 DOM 中。
    3 o# h- g) \# Z6 N0 d5 d; K
  10.   inserted: function (el) {
    8 E6 n+ Z+ |/ F6 f; u" X+ b. d
  11.     // 聚焦元素1 u5 c8 b. r5 w6 F
  12.     el.focus()
    * c, Q- T$ R) ~# b
  13.   }* k/ V; i# u' i% d3 A3 [9 E. W
  14. })
    ; l5 `% L. w9 q; Q
  15. // 创建根实例
    . F: z# B9 W/ J! I
  16. new Vue({
    ! ~: O( U3 T, D" t
  17.   el: '#app'
    + U, R. u- H6 \* s
  18. })8 F: Y- K) p% U9 A  v
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
# U. {# k  z+ s8 c9 _/ _1 }4 ~% N7 k, _
  1. <div id="app">
    6 p* R: n7 J$ O/ r( p' r, f3 ?: E- Q
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    6 e6 x8 {. a' B8 z
  3.   <input v-focus>6 d, i5 O0 \" e1 P4 A
  4. </div>5 j# H0 ~. J& e0 x1 F, B4 Z- r% [2 G
  5. ! u" U; h) C7 A3 S0 E* k
  6. <script>. P% e5 [2 _5 G2 i( O# S3 |
  7. // 创建根实例
    1 w' v( K6 l7 i6 J
  8. new Vue({' G0 Z4 n0 X6 P4 z
  9.   el: '#app'," N: p! L4 ]% c, N
  10.   directives: {
      b& s7 X3 t$ v6 \" g7 u3 F
  11.     // 注册一个局部的自定义指令 v-focus; ^0 u# I  V# a6 y  f" y
  12.     focus: {8 w6 W- N- i7 g1 I; O
  13.       // 指令的定义
    % _9 y) v0 @: j7 q' i
  14.       inserted: function (el) {. V! g9 I2 C: W9 I, {8 ~8 F
  15.         // 聚焦元素/ G7 n6 K6 V7 u
  16.         el.focus()/ o, @3 v; L( ?) l) C+ @2 R# F
  17.       }
    # B+ k7 w5 Q6 f4 H8 }
  18.     }% @4 H  N$ Y2 p" T' T( a) z. @  h( }
  19.   }
    1 W$ x% v- x( Z
  20. })0 \: j/ O6 [9 Z8 U1 M
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    + |+ G1 T3 a8 u2 D3 \
钩子函数参数
钩子函数的参数有:
  • 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 }。+ P5 h. o7 h& ~- r& X
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。8 Y6 O. A3 ~8 S5 `
以下实例演示了这些参数的使用:
实例8 q" T; o' d/ P* ^
, O9 N" Y5 |: q  _/ i$ S
  1. <div id="app"  v-runoob:hello.a.b="message">
    0 B) R! E: k5 Y# G$ i
  2. </div>
    ! P2 P. i, {  I6 F
  3. 5 z9 s) S' Z2 G. w  }7 i
  4. <script>
    " Q2 m# j; z) [8 D
  5. Vue.directive('runoob', {7 U8 S2 s6 P6 R; X! E
  6.   bind: function (el, binding, vnode) {
    3 C. x. I( T6 I. G+ w
  7.     var s = JSON.stringify4 t. ~/ U' d) D. Q% B$ p1 e
  8.     el.innerHTML =0 C  a7 F9 g- W1 ]
  9.       'name: '       + s(binding.name) + '<br>' +7 ^2 U- A% x0 O- U& t6 T, Y
  10.       'value: '      + s(binding.value) + '<br>' +
    : g9 v" M! N- M) B
  11.       'expression: ' + s(binding.expression) + '<br>' +& Z8 _$ F* \% r& v1 Y( b  Q
  12.       'argument: '   + s(binding.arg) + '<br>' +
    * M7 B3 W1 ]4 S6 a! o
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    " V' d. }: j) X" t& Z
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    ; q& |- E9 O) ^) E
  15.   }+ Y/ g: ~0 X9 s. I% E3 X
  16. })
    / T# D, X. y% H
  17. new Vue({+ Q# z8 \1 \% z+ P
  18.   el: '#app',/ t" r: Y, O) k* C, c4 s- J; C
  19.   data: {1 N7 v- v  m& ?
  20.     message: '菜鸟教程!'
    0 m- J" A: p: z4 o
  21.   }. K0 a- U4 g* S6 }; f. ^" B
  22. })
    1 g5 p+ m% Y' t5 r; a6 S
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
4 U: x$ a! ^' @) E7 S
  1. Vue.directive('runoob', function (el, binding) {" ?9 Z. y5 }$ j! e  t4 J. o8 u! s
  2.   // 设置指令的背景颜色4 p% \& V; z1 ]- C5 o) Z6 {4 |
  3.   el.style.backgroundColor = binding.value.color
    2 `& K+ k$ M& ~) V
  4. })
复制代码
! T; Y4 }( g5 W6 e0 o
; d4 T* f* H$ M# p% w# }  w
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例4 d6 u7 E/ T& A% S9 y" ?' `  I

- K" {- ?5 w$ c9 L2 T
  1. <div id="app">
    0 D; J& y9 d3 e: W
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    & g3 b4 X* S& h1 a* C2 h+ N& k7 e2 T4 G
  3. </div>
    ; m0 ?/ @( b- B% N3 [$ u& W( i
  4. ( n7 r" y8 ^0 j) q! l3 y
  5. <script>1 v& L8 c/ r4 |
  6. Vue.directive('runoob', function (el, binding) {1 X# s" B4 i6 N% f
  7.     // 简写方式设置文本及背景颜色8 o: A( g8 T, V# ?2 M+ f5 M4 w' h
  8.     el.innerHTML = binding.value.text' z! t1 d2 t; U  j6 A
  9.     el.style.backgroundColor = binding.value.color, A* x' b5 g; H, E! [
  10. })
    1 ^/ ~- ?1 {, C/ a/ j1 q# u% _
  11. new Vue({; }/ ?3 o" h& d; R$ [* s
  12.   el: '#app'
    ' y" o& I( ~- E" E
  13. })$ J- B! O/ x( ~  c
  14. </script>
复制代码
: ~& k' @+ x# d0 J/ F0 H6 r3 V

% _% p9 W+ ]2 p5 @; o- e) d7 @4 N5 ^* @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 16:31 , Processed in 0.106638 second(s), 19 queries .

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