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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

# U" p9 D: W/ d- S8 I8 [: Z
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例6 [2 j+ R4 e* x& o% d, `
( d. Y1 m6 x1 E5 X
  1. <div id="app">/ |: y; y. ?$ y- I( m  x2 J1 m; ?
  2.     <p>页面载入时,input 元素自动获取焦点:</p>' t1 x5 `$ c7 d( K
  3.     <input v-focus>* y% [( d0 o1 t- }( a3 G1 G$ @
  4. </div>3 a1 _2 e- F2 P- w1 F+ ]

  5. - I) y$ e& k( o8 }+ ^# u" N
  6. <script>
    8 T1 g! ~- R' L  c5 u% h# H
  7. // 注册一个全局自定义指令 v-focus6 Y' X1 d/ C2 Y: P
  8. Vue.directive('focus', {, }7 G2 l* j: ^* M! Y; M3 t
  9.   // 当绑定元素插入到 DOM 中。1 Y+ I) P1 l: M5 X5 ^0 J4 L
  10.   inserted: function (el) {6 Y3 N1 ?. p( a! o
  11.     // 聚焦元素! Y* S) ]* B5 a7 W
  12.     el.focus()
    4 k8 M# l! c* K5 }/ V/ Q0 ^# }
  13.   }
    6 s; y4 F* a% z" q( p& e4 r
  14. })
    % L, L; J% b5 E
  15. // 创建根实例6 p5 @5 ^" m, p5 U, b- r& U
  16. new Vue({
    ' _4 @2 f/ O# V) k# ~* D/ \: y- U
  17.   el: '#app'/ o' ?6 J2 ?7 _0 I
  18. })0 E# j' u  @# T( R$ s6 f8 ^# o
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例. b1 O" g1 z+ l6 L, c) v2 t9 L
' _( p. U# d5 f5 I
  1. <div id="app">+ {, b4 X% Q$ Q1 }) J- \
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
      X! \+ x* @4 H+ V/ l
  3.   <input v-focus>
    . ^0 W# e, u0 [
  4. </div>
    7 J% W# k& I  B. t8 o! S) y$ u2 \
  5. " Y' ~6 T0 P; \8 Q4 w; G
  6. <script>
    - j# S, `/ q1 I) q
  7. // 创建根实例1 H0 Y% Z0 D6 ?' T; G, q
  8. new Vue({
    3 |6 T) M2 q# R  a  U& ?& v9 ?9 p
  9.   el: '#app',
    0 L. Q1 N0 k9 v. F3 {% t
  10.   directives: {
    # i/ K6 h$ u& T3 {7 P
  11.     // 注册一个局部的自定义指令 v-focus
    6 J4 n8 K  `  T7 V+ O& Q
  12.     focus: {
    1 G7 Z7 @4 e  a. ]' j  N- N
  13.       // 指令的定义) F, {2 H/ U9 {1 l8 W
  14.       inserted: function (el) {; F$ ~, g4 r% L( T2 M5 [: ^
  15.         // 聚焦元素4 q7 I" v( O3 K1 d5 n9 }
  16.         el.focus()
    - s: p7 U8 n' s* I: t3 [% @
  17.       }+ E4 W2 p( \/ {' m
  18.     }+ |" k  N/ S& M. B
  19.   }' n( t* |: g$ X* E
  20. })
    ) d9 A3 f% ]' M9 `! t) Z$ Q; F
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    , d2 v# u9 {; F
钩子函数参数
钩子函数的参数有:
  • 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 }。
      8 L- }; h% b5 u  _: r/ D
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。1 e" I6 f3 X( D; {2 L* o; u
以下实例演示了这些参数的使用:
实例) X$ _2 ]) L, t- n- @& n
" }! f3 k- j3 K: g
  1. <div id="app"  v-runoob:hello.a.b="message">
    " H  c3 S. [5 p+ N
  2. </div>
    ! K5 e! i$ \" g" N

  3. + V. J; n" @9 C; m+ q
  4. <script>
    & `7 c( A- J  f
  5. Vue.directive('runoob', {
    / H$ W& v4 f; X2 b. Y4 n7 ]) n- e
  6.   bind: function (el, binding, vnode) {- H; K8 F; |. ]- b
  7.     var s = JSON.stringify5 |: ^% k9 ^3 ~3 v! m1 M% j
  8.     el.innerHTML =3 u1 ~1 G  ]8 `2 i. U! E: U- d
  9.       'name: '       + s(binding.name) + '<br>' +
    : Q; j* R. G5 V; l7 d5 r6 {; J
  10.       'value: '      + s(binding.value) + '<br>' +
    % o! V) \% S3 J9 O- o2 {; U
  11.       'expression: ' + s(binding.expression) + '<br>' +7 ~' M* ?8 L/ a0 @& u
  12.       'argument: '   + s(binding.arg) + '<br>' +! y$ u  x2 z" Q: F0 y5 \
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    ! L" x* k, ]+ ?. D
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    7 ?" B* F( w  k. j
  15.   }
    / z" ^  J3 G0 y0 y! |: A
  16. })7 f* p1 r1 K1 z; a9 \: b2 ?" ^
  17. new Vue({+ X2 {1 A1 g1 m  \  z, T
  18.   el: '#app',
      X7 I: p% ~# B
  19.   data: {
    + X7 E; \1 t' T! Y
  20.     message: '菜鸟教程!'( y- c- L; b  g4 {, f. [& ^/ s1 p0 t
  21.   }) [: ^; g" y: z( f, a) `
  22. })+ x) r" z0 n( N, T
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
' k7 L& u& M: E/ X" |
  1. Vue.directive('runoob', function (el, binding) {
    . J5 ?* N* D/ U9 ^# ]  N* b
  2.   // 设置指令的背景颜色6 y; e9 ^* M2 Z3 j* W: p' e
  3.   el.style.backgroundColor = binding.value.color8 i+ Z5 u5 X7 G
  4. })
复制代码
/ y8 s2 k7 p- y; u8 m" V" h7 e

5 q/ ?9 H: u; Y' y2 z( t
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例2 G. r) }6 J# ]% Q" u( W

$ o" V) Q1 \1 |; q1 H, E
  1. <div id="app">, m. F$ I. @8 J% |
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    * g+ D" t+ V+ o: z
  3. </div>
    8 e- A3 q0 g( h: u  W
  4. / _7 j  q  C" b, g/ d6 c& _$ n
  5. <script>9 b+ R& y& c" T
  6. Vue.directive('runoob', function (el, binding) {3 L( ~3 R3 n: r) V0 k! E% j! g
  7.     // 简写方式设置文本及背景颜色0 i+ K% O1 e/ s% R" N- ?
  8.     el.innerHTML = binding.value.text
    / U8 G+ d( m5 L5 }
  9.     el.style.backgroundColor = binding.value.color
    9 J: @, F) |% [. k& x: Q; y( ?
  10. })9 U( L- S" ^$ b! _9 [% I2 b
  11. new Vue({6 ?# ?; X, n& \9 H  s
  12.   el: '#app'
    0 X' ?# Q/ p/ Q- I6 L5 ^" m
  13. })6 h. z" L, O. q5 g$ y
  14. </script>
复制代码

6 q' c- V. Y; y  `1 N& P- l8 [) P! ?. \# e( O

$ T- _+ |& \7 Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 19:19 , Processed in 0.129305 second(s), 20 queries .

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