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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

3 U6 b1 U1 g3 a: q1 X" h
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例$ T9 E. N* Q# S: M) [; U6 ~
# C* s7 F7 l! O  U" C
  1. <div id="app">
    - [$ m: S* W& a
  2.     <p>页面载入时,input 元素自动获取焦点:</p>7 }  k# ^* B5 q2 ?2 u3 D7 h
  3.     <input v-focus>
    6 d0 {* ~7 I2 t! H& w
  4. </div>4 p$ T' n5 c: P9 V

  5. : A8 ^, z7 w1 v/ }
  6. <script>
    6 p- \! ~4 h/ J5 W  r
  7. // 注册一个全局自定义指令 v-focus0 l: v3 P. g' |' C
  8. Vue.directive('focus', {7 z7 i0 X+ G4 F3 q5 ~
  9.   // 当绑定元素插入到 DOM 中。- @% @- h: k2 w9 X7 V0 @
  10.   inserted: function (el) {& V8 j$ M( S$ D: v! j& f
  11.     // 聚焦元素
    ; l- h7 I2 S) `& ]% p. Q
  12.     el.focus()
    5 M* W8 f% S7 n1 g+ c
  13.   }
    ) i6 l. P$ v" v3 B+ n
  14. })
    0 B  E2 w- ]" |
  15. // 创建根实例3 U  ]$ U9 t2 t4 m; u) \# ?
  16. new Vue({
    ; n! `+ [) K" Q& j6 ^0 t" Z
  17.   el: '#app'- }; ~4 w" y' H6 U$ Y6 g& L
  18. })5 h7 m& T! Q1 a8 _: b  I3 O3 I
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
1 r; [5 ]0 s% |2 z3 I8 a
" z' K  ^8 e6 G) Q4 @4 ]  C
  1. <div id="app">
    & o+ n. z: t$ f! L- y
  2.   <p>页面载入时,input 元素自动获取焦点:</p>8 `6 }1 ]8 `6 m# p# q7 e
  3.   <input v-focus>
    2 ?% y+ L  z0 X: ~8 Y+ z
  4. </div>
    : k: n" X" U  T0 q8 v
  5. 4 K) T8 `- i* P! Q( m- }* F  J( m
  6. <script>) i$ S. K5 u  C& _/ A
  7. // 创建根实例
    + L  t9 t; C% N1 e, U4 a7 J
  8. new Vue({
    6 [6 Q" t* k- Z8 `
  9.   el: '#app',: W( a* a( d) K) ?# x5 T
  10.   directives: {
    8 n( [* x- Y( ^. T
  11.     // 注册一个局部的自定义指令 v-focus8 Y' b, y! a0 w" f8 W
  12.     focus: {/ i3 l+ H6 |% J' o& e( b) W4 n
  13.       // 指令的定义
    ; b4 ~/ a! G! ~; E
  14.       inserted: function (el) {9 i8 M- z$ [0 ~
  15.         // 聚焦元素
    ; L& r  M& ^3 z" F
  16.         el.focus()
    % ^4 q; Z0 w' Z; s% V8 H, s0 K
  17.       }
    : F0 b* V( n6 ^& d! M7 r
  18.     }
    0 @' g/ D: g* a( }- b# m  W* y
  19.   }
    2 V) @# Q7 L- p
  20. })
    2 a/ N, p/ r, R! _
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    ! U0 h5 f( t: N7 j% `; Q2 h
钩子函数参数
钩子函数的参数有:
  • 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 }。6 ?4 D# r3 c8 l* @# t# V- F9 }
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。. v5 _# z5 Y& |3 Z+ ^
以下实例演示了这些参数的使用:
实例
4 s% @% J* e; s8 m; d4 v, _. _6 x& P' `
  1. <div id="app"  v-runoob:hello.a.b="message">" e0 s( [; w% ]8 Q% C
  2. </div>
    0 `1 E* a+ c/ y  j9 K( [* i; [

  3.   d& s8 [& ]' _0 h5 S
  4. <script>. ~6 m6 [. a1 V  F
  5. Vue.directive('runoob', {$ G( Z' U1 d( v6 S
  6.   bind: function (el, binding, vnode) {
    + p" w; s0 X2 n  ]
  7.     var s = JSON.stringify
    # D" f4 i+ l. W6 a" @5 c# _
  8.     el.innerHTML =  y- i: y, ^$ u# t; ^8 r( x
  9.       'name: '       + s(binding.name) + '<br>' +
    $ n+ s2 i0 o+ J
  10.       'value: '      + s(binding.value) + '<br>' +( S+ R  m1 R9 x) z2 T4 B! \
  11.       'expression: ' + s(binding.expression) + '<br>' +
    ! ~% r5 D: ]( }2 W. A
  12.       'argument: '   + s(binding.arg) + '<br>' +
    * n" v0 f6 k0 g" I+ r
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    . K. w' ]. h6 d
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')/ b$ n- I2 T0 s8 O) J
  15.   }/ {' Q# k1 v; i" F# V) B* @! m
  16. })7 |* [0 d2 F+ C: p4 v3 ~5 R) ^1 d( Q  U
  17. new Vue({# H& z* n/ j! B6 j" `) X. p
  18.   el: '#app',
    . q2 ]/ U: A2 {% s7 Y
  19.   data: {
    ) q9 E# S  ?& U5 R# ^, \
  20.     message: '菜鸟教程!'* W8 {4 t3 G: }: _) c- C
  21.   }
    , l: K: @( s4 K: |" N
  22. })9 d* m$ r, S/ @9 {) Q8 B* @
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
5 s3 l4 D; N7 o) s4 C
  1. Vue.directive('runoob', function (el, binding) {
    # b0 N3 l' c* J  t. \$ @
  2.   // 设置指令的背景颜色
    9 z" W+ h: L  s$ [1 M7 N
  3.   el.style.backgroundColor = binding.value.color
    5 U7 c% \) l! n' j3 z
  4. })
复制代码
9 U/ J: b, X$ w; T9 J. O
  [  C- F4 c% c( G% k9 J
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例* x- O$ ]- u8 v8 |0 ~$ l
6 `% E) y0 C  T9 a
  1. <div id="app">
    ; g: H; I$ V; c: p# `" V! f  R1 u! b
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>$ i# p5 |& u# V
  3. </div>' B1 g, l6 A) T$ t* D& J1 q

  4. ' H7 X" U2 @# h0 U- \7 H
  5. <script>
    / g" j3 v3 z  w/ ^7 W* f5 w. v
  6. Vue.directive('runoob', function (el, binding) {
    : U8 X% n* v; D6 r
  7.     // 简写方式设置文本及背景颜色
      q: d, u9 r1 p3 S
  8.     el.innerHTML = binding.value.text. E8 `% S  M5 ?5 J! E1 b% ^/ M
  9.     el.style.backgroundColor = binding.value.color
      o) T- u* w2 _4 t) ]( P" F
  10. }). u# U/ g* S" Z9 f' L
  11. new Vue({/ V* k6 a! J/ b% M6 Y0 e
  12.   el: '#app'6 }' \% V6 v  [
  13. })* p2 w8 R& G  M; v
  14. </script>
复制代码

! x- `( _6 G5 H$ m, `+ \/ @( U! G% c( p  W! C& G

5 u* |& n) e2 c4 c- S) _; h  e+ {/ B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-5 11:37 , Processed in 0.123377 second(s), 19 queries .

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