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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

& W9 n9 A# K0 u
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例5 c) Y) R2 h6 }4 o: q5 n2 |
% S1 C9 o2 E8 D, I& \  i9 K4 d5 b
  1. <div id="app">
    2 I/ _* K; ~1 `
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    0 C$ ]9 G, n- U- x, R  q0 [1 w
  3.     <input v-focus>
    / n# p$ I2 I9 r- s
  4. </div>
    4 ^/ K& J1 U$ l, p6 {

  5. 1 r$ ]" w$ R2 W' R) X6 t9 u- o
  6. <script>9 G: _1 L4 h* V
  7. // 注册一个全局自定义指令 v-focus- k0 _: k2 v/ J8 d; l
  8. Vue.directive('focus', {
      O3 |5 T% O: }
  9.   // 当绑定元素插入到 DOM 中。
    5 z" I4 d8 b" w* ~: t6 k
  10.   inserted: function (el) {* X% k% w# @! ~* y! n+ n
  11.     // 聚焦元素
    , T% V, J2 [8 ~2 d" o: D2 g
  12.     el.focus()- \* K& d, ~2 H2 I+ p
  13.   }/ i& v* m" L6 A
  14. })
    ) |$ y1 f/ c" l/ A7 k" c) q
  15. // 创建根实例
    ; _$ c6 ?9 f. t% F  @/ P: g/ e
  16. new Vue({0 p9 W& t: Y/ e2 m1 g2 S
  17.   el: '#app'4 X) l- d) F8 @3 z
  18. }), D( E: M4 H, n- b2 a9 j
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例2 ~* N* I5 R$ i6 L* y- e

' ?0 {% q6 j" i! m
  1. <div id="app">* |8 h6 q  R5 U9 D" a4 B3 Z' ]
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
      r; h' u' M3 s* c; p3 A
  3.   <input v-focus>
    - ^# O6 K8 b+ S- I7 f% i4 Y
  4. </div>7 R& e4 x/ z& |  M) J
  5. / H* m* u( w' U; |
  6. <script>7 _+ }5 Y/ H4 g1 [8 H4 z, ~4 n
  7. // 创建根实例
    ; N8 t$ R6 d9 O& c- j: R2 @
  8. new Vue({
    ! a' [% {$ U' X, E! q, G+ ]7 U. J
  9.   el: '#app',
    3 ?# |  ~! L  ^. v/ J+ e+ @
  10.   directives: {
    ( Q$ ~8 L7 `5 B' X5 `4 m
  11.     // 注册一个局部的自定义指令 v-focus
    1 j, d5 l* J! G& e0 p$ a
  12.     focus: {" B- d8 D: o! k! L- ^7 L. @+ d
  13.       // 指令的定义' P+ A( U4 z' A* ]: w$ J0 A/ ^
  14.       inserted: function (el) {# C. `0 n+ ?; B5 e& y
  15.         // 聚焦元素
    1 a0 f+ U* Y9 D/ c: c9 h
  16.         el.focus()* ?8 ?$ ^/ E6 V! k
  17.       }2 x& M# }# ~7 ~1 R! ?
  18.     }
    ) i$ u9 W3 d8 F: |" N" v+ C, A" s
  19.   }
    4 [. h$ @/ E! ~( O3 z+ }/ W# @( q$ @+ o
  20. })
    # J# O% u8 P; [  a. J/ s
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    2 ]- b6 s1 P! t: E( |
钩子函数参数
钩子函数的参数有:
  • 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 }。3 `* J: f& p2 l4 I
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    ' V" l; F  Z: B) A! J
以下实例演示了这些参数的使用:
实例0 Q+ G& _  ?! p' D8 T$ c
8 d; z' L( o5 ]$ [2 Q/ E1 K
  1. <div id="app"  v-runoob:hello.a.b="message">
    # V  ^' i  {% ^" M; G
  2. </div>0 K  ?9 l& g5 j0 ]

  3.   Z+ A+ p. ?6 p0 j# x8 L# T
  4. <script>' e7 D0 V+ Y# t8 |7 Y% d
  5. Vue.directive('runoob', {3 z$ r$ s% _; W3 P9 V/ w
  6.   bind: function (el, binding, vnode) {
    * R$ \+ i. x! d. N, [' B) b
  7.     var s = JSON.stringify
    ; J- X: o$ l9 B' s5 s6 L. M% s( @
  8.     el.innerHTML =
    * }' H0 ?2 k& g5 Y2 s: O
  9.       'name: '       + s(binding.name) + '<br>' +
    1 |% ~/ E, n: o/ {
  10.       'value: '      + s(binding.value) + '<br>' +' a, P8 F6 `% f/ S$ K: f: [& e8 Y
  11.       'expression: ' + s(binding.expression) + '<br>' +
    1 m/ ~' `0 x* ^) W6 h
  12.       'argument: '   + s(binding.arg) + '<br>' +
    ! S! H& i5 m# C, F$ ~( ^8 |( x
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +: K8 g& B" Z8 O  }8 h
  14.       'vnode keys: ' + Object.keys(vnode).join(', '), d2 ]2 R3 A" R2 l2 D( L5 `
  15.   }4 u" ?6 P, d( K: Y. m- X
  16. })
    " o3 A% q& e8 F$ _
  17. new Vue({7 }' K! ?% E* s* W( B8 M0 b
  18.   el: '#app',! }- T6 |2 j8 d/ L  ]
  19.   data: {( B# ^1 v/ f5 ^. R/ Z# X! ?  \
  20.     message: '菜鸟教程!'
    ( n  `' K7 q2 @8 [
  21.   }
    ! U  |9 J4 s# o1 N: v' T1 }
  22. })0 W; F' J; U/ e" m
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:) G5 e& S+ S5 m. N
  1. Vue.directive('runoob', function (el, binding) {, i/ ~+ A, z: I9 X
  2.   // 设置指令的背景颜色+ h' A+ Z. ~: Z/ f
  3.   el.style.backgroundColor = binding.value.color: v2 r1 H4 _& X
  4. })
复制代码
- M  B! N# L1 t  P2 E
& Q( G) U2 J* a2 W" z9 P
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例+ T9 O) s$ L8 S9 y+ a# Q
# {  n7 d  A8 l( a7 M
  1. <div id="app">
    : b0 e; X2 |& T) z; F& f, V
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>4 V3 M# P$ v$ x1 Q8 S8 H
  3. </div>
    % P. Y& M* d& t- N# h' L
  4. # B, M  j1 s) W9 p* @2 b
  5. <script>
    * H1 |0 K- v3 ?4 \
  6. Vue.directive('runoob', function (el, binding) {9 I7 s* A, v" @; R: G
  7.     // 简写方式设置文本及背景颜色. V. b; |" Q# _/ {1 s- b
  8.     el.innerHTML = binding.value.text' G7 F# D$ d+ U8 V: u
  9.     el.style.backgroundColor = binding.value.color
    0 i0 z( D: Y+ a) K# q
  10. })
    / D5 _9 ]% E# a1 |& b# @
  11. new Vue({$ y: c- L5 K0 X: [+ S* R; m' C
  12.   el: '#app'* [% Y1 f# K& A* c& {: P4 }! S  {, n
  13. })
    9 K* d1 k8 o) g, p5 K
  14. </script>
复制代码

2 p* q: G" S+ f. y4 w& ]! l; g( V5 T% c$ s6 `3 b" h

+ A/ U6 H' O; u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 21:45 , Processed in 0.118357 second(s), 22 queries .

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