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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

1 |  R4 l: S+ [5 y" y
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
$ }$ V7 m7 W) D( P+ W) u
- ]$ H1 ~) \5 G4 r
  1. <div id="app">
    ! p" R- D  T& F6 J/ W- }+ n9 C  Q
  2.     <p>页面载入时,input 元素自动获取焦点:</p>6 [2 s$ O$ u5 K$ ?8 s* R8 V
  3.     <input v-focus>  {' }2 R, _; b* F: x
  4. </div>
    2 H: G" n# ?# f

  5. 6 w& G! S- v) q. m' o" b
  6. <script>- E2 u6 B- O+ A) N/ r
  7. // 注册一个全局自定义指令 v-focus
    ; ?# U1 X# H+ w( h/ A
  8. Vue.directive('focus', {
    / a. q4 f) z% o0 p
  9.   // 当绑定元素插入到 DOM 中。
    0 }5 e; E; q$ Y5 {7 e
  10.   inserted: function (el) {7 i# s: o6 r( c% Y3 s7 V
  11.     // 聚焦元素
    ! x; W3 |& P% F) q, R. d$ o, }" V
  12.     el.focus()
    9 D( w( l9 J6 A. k( Y
  13.   }8 @& e+ t# \7 h3 M( i4 @
  14. })
    $ i  V# p. j" L- S& P& G
  15. // 创建根实例+ G% p! L9 w% e% j# Y7 w8 E
  16. new Vue({% _0 ?4 }9 T+ @, x4 \5 _) H
  17.   el: '#app'
    : G: r) u- A8 c. E4 J. G
  18. })* k: C0 |9 H, u' b8 ~$ a
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例6 |9 M/ @0 d& ?7 I+ z# X' S2 n
7 \2 [1 T$ X& p  m* a7 K- B/ ^" c
  1. <div id="app">
    8 L, k. X& F7 E/ l/ {9 K" a
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    4 Y" l, n4 ^" U- C5 T4 ~
  3.   <input v-focus>
    $ I, G6 F& C( C
  4. </div>6 P  D* R( _: s8 I$ R5 o
  5. % N8 w6 q3 D* Y' T, V; l! p" y  p
  6. <script>
    * B, R6 [4 e! E  z: a, S
  7. // 创建根实例
    * [. W1 ^/ ?1 h( z6 Z% ?
  8. new Vue({
    6 `% A  U2 i4 g$ e7 R" ^
  9.   el: '#app',
    & s, O1 ?, H9 G* f: s" G; F
  10.   directives: {
    ) C: @9 k: P  o
  11.     // 注册一个局部的自定义指令 v-focus  y% z5 D6 J# F, {
  12.     focus: {& b9 V7 n% }$ w$ Y9 F9 C
  13.       // 指令的定义
    ; j( \+ E0 a1 O' P; a* R$ P: F
  14.       inserted: function (el) {
    * P1 [" Q& a% {5 d  ~. _
  15.         // 聚焦元素( I6 b; S8 ~. C  {9 X5 q- U0 ~) y4 C
  16.         el.focus()7 z6 w( p0 O: S; q& h* a1 o* I
  17.       }, ~+ L* G( e; |0 R7 C& ]! S
  18.     }8 ?( P- u5 j! B
  19.   }+ i! _7 Y2 b; p. w9 h$ {( I
  20. })
    ; f; Q+ X% Y2 n# V) j- _, p" G
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    " C7 [- N, w8 i9 O- z* R! p
钩子函数参数
钩子函数的参数有:
  • 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 }。! D5 T* `- k9 D5 t8 g3 D9 a
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。& X/ U6 A' q. _1 p" j+ L1 O$ g
以下实例演示了这些参数的使用:
实例9 ?( |0 g& Q( {1 S) Q2 x

: C$ I1 L2 E$ E" S1 Q
  1. <div id="app"  v-runoob:hello.a.b="message">7 `, R2 [! e! Y5 z9 D
  2. </div>
    ( g- O  X. \6 |; L

  3. $ o- m+ I; x2 D! U" t
  4. <script>' I$ S, s. g( b- f  z/ Z$ x, Y
  5. Vue.directive('runoob', {; k' O6 v2 Z5 f! u
  6.   bind: function (el, binding, vnode) {
    # X$ ^7 k- i* k1 q- W
  7.     var s = JSON.stringify
    ; R9 Y5 U1 o$ J5 u  h0 i& C$ s. {
  8.     el.innerHTML =
    9 N$ z! B3 P  S4 G& s
  9.       'name: '       + s(binding.name) + '<br>' +
    - i$ K% A  X1 I
  10.       'value: '      + s(binding.value) + '<br>' +- K) N$ g9 G! v8 W, K6 B
  11.       'expression: ' + s(binding.expression) + '<br>' +
    : d3 X7 d1 \# X  u
  12.       'argument: '   + s(binding.arg) + '<br>' +4 f+ h9 h/ W/ i( w, ]
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +6 i" r1 P8 T! t& b6 p9 q
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    / z% F" p; q! L; Z
  15.   }0 R- B% o" k1 @, m
  16. })3 n8 m" Q. u( C; R
  17. new Vue({+ d6 m3 p! z% e8 ]7 ?5 L- H
  18.   el: '#app',
    - B- G+ H5 }8 c5 `4 R: A8 m
  19.   data: {
    0 h+ A* ~: l9 O
  20.     message: '菜鸟教程!'
    1 Z- V. p2 v- ~
  21.   }
    % ~# r7 U* k3 Z2 I8 X! e- f
  22. })6 k- Z% f, p* G  z/ g$ B
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:9 B, x7 F9 }) S) d
  1. Vue.directive('runoob', function (el, binding) {
    7 @! Q" e3 Z- ?( O' g7 P
  2.   // 设置指令的背景颜色
    1 _$ `& |4 J9 J. D
  3.   el.style.backgroundColor = binding.value.color
    ) ]. G: ~! Z. x  b3 l2 y: S& O
  4. })
复制代码

. u$ i" g6 R- S' j/ |
+ B) x. c  ~0 Y5 K  x$ C5 i
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
; ^' K7 v0 k8 }' O3 A5 X# m0 H4 B$ d: ?% S: E5 Y  U
  1. <div id="app">
    4 a- }4 ?2 ^, g0 R9 y' q  y# y+ s/ G
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    / F' f% m! g% M# z7 s  F
  3. </div>
      \! r! H- g3 {% G: d/ G! ]/ g
  4. 1 {9 D; f+ z- }. k" X- h
  5. <script>
    ) N0 \/ r5 r+ H2 J. n! j
  6. Vue.directive('runoob', function (el, binding) {7 \7 [. a0 M0 p2 [
  7.     // 简写方式设置文本及背景颜色
    ! I" Y2 j% N- O& w/ e3 ]  |1 }6 I: z
  8.     el.innerHTML = binding.value.text
    5 F3 `! Z, M6 q  w9 F
  9.     el.style.backgroundColor = binding.value.color# m: Y# l( l/ D8 f
  10. })
    ! Y* |8 u$ ], {$ z1 I. B: d2 ~2 T
  11. new Vue({
    ( {! N# U+ G  q) V( {
  12.   el: '#app'
    * {5 m. E% R* k# Z2 R
  13. })
    ' g+ W8 R- L& o! Z6 Y6 q
  14. </script>
复制代码

7 z) O. `4 `4 f+ E# |& w8 s9 G# I8 C! d

' y6 A* ?) N! K' B1 {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-5 05:22 , Processed in 0.119565 second(s), 22 queries .

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