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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

7 L% m$ _6 I2 {7 [$ p( f
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例+ _4 B4 {  P: C% N* y' k
' f* l- i& S" l5 j5 t
  1. <div id="app">2 V* y3 I: Z: N% q4 h2 h' ?
  2.     <p>页面载入时,input 元素自动获取焦点:</p>' X& W3 x( ~) q: o) ], i
  3.     <input v-focus>
      m8 r; T( u% v0 \: _7 j1 U
  4. </div>
    6 P& j# I3 x9 f, H3 G4 i: C

  5. + r- _3 c5 _: S' `& ~, Z6 c2 U
  6. <script>
    3 n" N4 t3 _+ W7 d7 k5 K5 m
  7. // 注册一个全局自定义指令 v-focus
    $ M0 w* h2 V, `6 G4 U
  8. Vue.directive('focus', {
    ) F) t" k- C( [9 d2 O
  9.   // 当绑定元素插入到 DOM 中。1 Q( G. A4 j/ M. b
  10.   inserted: function (el) {
    8 ~1 x4 P( S, M, z( V
  11.     // 聚焦元素
    4 P) Q2 d2 z$ U. ^% q, M
  12.     el.focus()0 ~8 i9 Q0 ?6 a
  13.   }! v+ ~- R" C! C
  14. })2 \3 b8 ~% O  P  b9 z% h
  15. // 创建根实例1 t3 K: ~. M- e* b3 c9 t/ X
  16. new Vue({0 F$ K7 I# i  p9 i, o
  17.   el: '#app'8 s+ v7 x; f$ H) L- X6 R8 i5 v- r
  18. })' B+ v% @" n" J" Z0 N% b$ I
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例! o6 U* m" h+ A- F6 f
1 q& A3 I8 W# d0 K" R9 C
  1. <div id="app">
    . R1 A5 E% p3 D+ s6 x
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    2 U8 l) S1 o: k( D" v
  3.   <input v-focus>
    8 n6 E  s: r+ x8 e
  4. </div>& y! \: }' E9 F- ^& b% B2 o
  5. " f7 j9 Y% |4 q% ?" C, r
  6. <script>
    4 O! v  A0 r" G: h/ j$ Q) Y
  7. // 创建根实例: Z7 e+ M9 ~" L/ B
  8. new Vue({
    ; i9 K3 ~  c6 j" x, [# P+ y- f. B" _
  9.   el: '#app',
    ) G, h! O  I6 [) z6 Z' w8 @
  10.   directives: {# ?2 [; k1 R) [- ]# ]# g. l- O
  11.     // 注册一个局部的自定义指令 v-focus2 O2 J( k' v) \# |* y# N: F
  12.     focus: {; l/ [$ L! f0 W$ O/ x3 N5 [
  13.       // 指令的定义
    ' T0 V: r0 i: h) j6 ^" @
  14.       inserted: function (el) {' {% L3 d  u  w$ N1 U! d& m
  15.         // 聚焦元素8 j7 T+ I3 ]  K6 p) u' }
  16.         el.focus()% t, U' W8 O. [2 X% _* a
  17.       }  T& L4 |1 h7 p7 o& x
  18.     }
    * O( _8 ^: f( _" Z0 n6 @4 V+ _1 O
  19.   }: q% \7 z; n6 ~5 O6 K  C' L
  20. })1 X0 G; G# h) \/ y
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    . P6 ~" C- h0 Q& O, |* n4 S9 J
钩子函数参数
钩子函数的参数有:
  • 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 }。
      & ]- V( h/ N. l# e+ o% {& [
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。% d: Y$ `) E8 s8 I5 @
以下实例演示了这些参数的使用:
实例# c9 i2 g( ^# N- Z) W

6 C; c: n* |1 d/ ~$ j1 O5 s+ B  T
  1. <div id="app"  v-runoob:hello.a.b="message">
    0 ]: @6 I  d# n4 F8 C" \8 O# r
  2. </div>
    ; U1 j& x, ]" m
  3. 6 I3 W8 @4 V) D7 V8 y8 s
  4. <script>
    / V& h5 D1 X& ^$ n2 p
  5. Vue.directive('runoob', {* Z" F* S/ N3 |! F  T' f  L
  6.   bind: function (el, binding, vnode) {8 u/ W& l1 R1 d5 T$ n3 A3 @1 M/ \
  7.     var s = JSON.stringify; K" n! X* H. H
  8.     el.innerHTML =) U4 _0 s( _/ d6 W5 o& T
  9.       'name: '       + s(binding.name) + '<br>' +& \; V) I  N2 g" c% z6 e
  10.       'value: '      + s(binding.value) + '<br>' +1 f1 P" z2 R4 A! l1 P4 n' |
  11.       'expression: ' + s(binding.expression) + '<br>' +) ?. e9 S: v; n2 E+ n
  12.       'argument: '   + s(binding.arg) + '<br>' +% U: [" e0 ?2 k( m, M. {8 i
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +% h" {2 o) A' T! q4 J+ j
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')) }8 d9 M1 s9 A% C) h5 U8 m6 N0 _
  15.   }  J; r. [; @0 p" t8 s' A" A% T
  16. })
    : b; `/ [3 \# b$ s5 o3 h8 H6 {
  17. new Vue({% D! t' K1 q0 z. O' E: Z* ]( a
  18.   el: '#app',
    ( k5 R- n7 r/ I" y! H' \
  19.   data: {3 n' U) F# ]* X# U
  20.     message: '菜鸟教程!'
    , Y9 |" I" m- f3 F) }# Q9 m+ m! j& K
  21.   }  j6 |: _* w7 B3 O) m: e$ N# ~2 z
  22. })
    7 f2 u3 c6 X) }( C) s6 G* |' w) M
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:( t2 f: v- H- f0 J, g5 z
  1. Vue.directive('runoob', function (el, binding) {* f- z3 h% e5 w
  2.   // 设置指令的背景颜色. Y" _# O8 q3 ^0 i9 b$ A4 M
  3.   el.style.backgroundColor = binding.value.color" G* |) V( ]8 i3 }
  4. })
复制代码

% Z  @9 i" c& ]2 ?% S6 I+ M% \# a4 l  w0 p5 g! w8 ]1 t
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例) g6 B( |& o: N! E/ ?' e/ _
9 U  v* K0 j% D# i  l" C8 |" D
  1. <div id="app">
      Q4 F) E4 z: W# b& r
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>  H0 A( _+ k: W9 A
  3. </div>
    / U! I3 v9 H) W. U) R6 y( w* G* [

  4. ( o* G( C0 T* b: c, Y
  5. <script>0 S# e, K, K, Q
  6. Vue.directive('runoob', function (el, binding) {/ n6 l; X6 j9 ^# B: j& n5 d4 y
  7.     // 简写方式设置文本及背景颜色  [7 A- B9 |( I2 a. s4 T0 x& n
  8.     el.innerHTML = binding.value.text
    9 O- i' |: F0 E2 a/ U
  9.     el.style.backgroundColor = binding.value.color6 ^6 |; Z& ^( l! l
  10. })
    . u5 T) l3 |9 X% q
  11. new Vue({
    ; Y5 \- w: b. ~
  12.   el: '#app'* m; M+ P+ \# p) [  d" s- U2 q
  13. })& j1 o: C4 h  `9 j9 k
  14. </script>
复制代码
* q3 L# k. F2 X$ ^. o' ?8 q
, g- O0 \; h2 i7 H/ ]
6 E  k) X$ M/ z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 21:34 , Processed in 0.109227 second(s), 20 queries .

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