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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

; u  G" r/ H) m  n) ^
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
4 A9 N0 c/ ?1 i5 {
* y6 }; [8 m$ |8 f1 F; @
  1. <div id="app">4 F0 q6 }0 Q8 A6 j- T. N
  2.     <p>页面载入时,input 元素自动获取焦点:</p>1 @  }: M" b- k, e+ ]; T" X  ]3 [
  3.     <input v-focus>
    : `0 \9 k9 R( P  T- J
  4. </div>
    " Z. t1 J5 h# t

  5. 0 a8 d* W. M7 Y
  6. <script>
    6 V0 _- \- M6 n6 ?
  7. // 注册一个全局自定义指令 v-focus7 N1 Z3 ^' {, j
  8. Vue.directive('focus', {
      A6 {, e0 F5 y3 O
  9.   // 当绑定元素插入到 DOM 中。* U% M9 M* I- _4 B0 y  }3 Y
  10.   inserted: function (el) {
    5 P' M2 [0 t9 @
  11.     // 聚焦元素
    5 x0 r5 S) b+ b$ H' |. D, ~/ `" _3 f, b' X
  12.     el.focus()1 J3 {& P9 y/ o$ R4 ?3 A* i2 [
  13.   }
    " J5 r. t+ M. I8 @7 \' Y' S. C' u  c
  14. })" u9 P! M$ l* P8 z" o2 i! z, \
  15. // 创建根实例$ s) A9 s6 l6 Q: {" ~& i
  16. new Vue({
    9 {5 M0 e8 I  x0 [! V  ?
  17.   el: '#app'2 N9 K+ T" A. A' Y
  18. })
    ) g' v  I3 l* r$ v0 n
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例9 ~9 c8 w5 y7 B3 D
" f! F  O) v  l& @. p1 f- m: M
  1. <div id="app">* m1 T% Y; O/ e4 d1 A
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
      l6 U" d/ z) c
  3.   <input v-focus>* P4 F" ~; B; E( ^
  4. </div>
    $ o; l$ V: C7 @; o
  5. . [8 x: F0 ~5 n8 h  I# i4 B% e
  6. <script>
    6 T( ]3 L0 \7 [4 p
  7. // 创建根实例  x* p, f# |: m, @
  8. new Vue({
    $ t/ N8 M0 _& h" k+ }
  9.   el: '#app',8 v3 ]2 d# x$ n: ]  S( ^( C) A7 R
  10.   directives: {/ \, C# p, I9 ~% O! c
  11.     // 注册一个局部的自定义指令 v-focus
    6 Z& T. [& n' ]
  12.     focus: {* Q9 A* U# s% k9 \& z+ I
  13.       // 指令的定义
    " A( ~8 E. o, K8 O6 G
  14.       inserted: function (el) {8 Z( a* Q4 `3 R
  15.         // 聚焦元素
    " S2 ^- N' K, N2 a% V7 `6 p! z
  16.         el.focus()
    % q# ^$ c, o. ]5 u7 @
  17.       }
    8 {! n4 l6 L( s' h9 W
  18.     }# h, g2 R, |% S1 B" J
  19.   }) N1 M$ B" X) z7 U
  20. }); A9 X) x/ T0 m" U5 _% M
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    7 }) q1 L, o+ ?1 N9 j& E9 z) ^
钩子函数参数
钩子函数的参数有:
  • 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 }。
      , }2 `9 @9 d! Z; t
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。3 H' @- u& v, l$ I  h$ s
以下实例演示了这些参数的使用:
实例" \2 E$ A7 x8 g8 b/ @

$ M1 s2 I0 h3 N
  1. <div id="app"  v-runoob:hello.a.b="message">2 y6 {# r) q8 f) q3 ?$ X
  2. </div>
    4 ?2 _/ v8 z7 O) c5 T! C1 n

  3. ) e, V7 d+ L4 T: r1 J
  4. <script>
    6 t5 p% ]& q% k7 `
  5. Vue.directive('runoob', {
    ! E) u: a, c+ N/ F! T( ?' B
  6.   bind: function (el, binding, vnode) {# K/ p6 {6 r1 o1 k- s  N
  7.     var s = JSON.stringify( M" q& ^8 S2 i, I$ Q0 a
  8.     el.innerHTML =! C6 S+ A9 M" [# v; \' Y) K
  9.       'name: '       + s(binding.name) + '<br>' +& j5 g9 E8 G4 ]! k5 S. c! }
  10.       'value: '      + s(binding.value) + '<br>' +
    " j6 v/ C2 ~' l: L" G8 n
  11.       'expression: ' + s(binding.expression) + '<br>' +4 ~4 b& X* R* \9 e
  12.       'argument: '   + s(binding.arg) + '<br>' +2 Z1 \2 n9 f- I, h5 \* F8 w* O
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    $ U: N0 ^/ c9 v7 q  X
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    0 o6 I% P: ]; b2 c1 c0 u- z4 C
  15.   }' ]0 }, F& h. z3 C  O$ O; x# B9 e
  16. })3 t- n$ P* g' G% c( `" Y1 |. V
  17. new Vue({
    3 W, ?0 P8 b, `0 s; E" Q
  18.   el: '#app',
    ) Q2 Z7 d! r( _9 @+ z; c
  19.   data: {
    0 c! K+ K/ ?, |& H* W: v
  20.     message: '菜鸟教程!'
    . \, W( `; a6 F2 L' s! R
  21.   }$ [6 A4 ]! \8 b8 T5 z# T
  22. })7 E; {- ]- D. A9 L! k9 e
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:" u4 I4 V7 l* M9 E1 z% x2 C+ p
  1. Vue.directive('runoob', function (el, binding) {! E  ^, ^' b" S7 N' S
  2.   // 设置指令的背景颜色
    3 W# L5 W4 Y- N% {. q' ~
  3.   el.style.backgroundColor = binding.value.color* i0 ^2 k4 A; @' i2 Q; m
  4. })
复制代码
% c: c* [' H/ E' n
2 q4 T' F7 b" u7 O
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
" p# I: @7 W$ D" b8 `; e& N; M( N3 c  {( H* M% ^0 I4 {
  1. <div id="app">
    ' b5 @6 _; Q* L5 _% A, ^
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>: m: y% v8 y% p% u5 \6 C
  3. </div>
    # s- ]- d% {1 f" k2 d0 j% I

  4. * W3 D6 J5 G% D& D
  5. <script>
    ( J8 B" G7 V/ I: G6 h
  6. Vue.directive('runoob', function (el, binding) {5 k; w% c; y/ B6 |9 r" W* A: J7 ^
  7.     // 简写方式设置文本及背景颜色+ O6 Z' r, {. y$ S8 |1 d
  8.     el.innerHTML = binding.value.text
    ) a5 z0 O6 i2 X* W! |! B
  9.     el.style.backgroundColor = binding.value.color
    6 D8 k: d% {' M. e0 S
  10. })
    1 E! F) n, a* k7 c
  11. new Vue({
    ' w" P) ]0 R" ~- ?! Z
  12.   el: '#app'
    5 Q2 n1 x+ ~6 ?, @3 _& f3 p7 U# M
  13. })
    : Y! t) h7 Z7 S: M3 \
  14. </script>
复制代码

# I9 s! o1 D2 J- V4 a" O$ u( @4 \0 k/ t( `# Q, }. C4 X8 r1 x
# j/ s2 S' c3 u# k" w: Y) P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 07:22 , Processed in 0.055585 second(s), 21 queries .

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