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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

( K) K/ M  k" k8 ]- n' G
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
1 b5 m) `" D. ]( A
- W6 l) P1 M9 s8 }, D
  1. <div id="app">9 i# n) n: d7 w4 o. B
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    4 l, q% t0 u$ k. {) o0 u
  3.     <input v-focus>
    " f/ m# n4 k! v% {
  4. </div>
    ( e6 s3 t. \* P- S, J8 B6 N0 h' A

  5. + X3 z" f, L- D2 P# p  R
  6. <script>& _5 u2 P* X/ k: g+ w
  7. // 注册一个全局自定义指令 v-focus- s  f7 Q3 I! w' O, x
  8. Vue.directive('focus', {! p9 m; Q* F  D, w$ {
  9.   // 当绑定元素插入到 DOM 中。0 d/ k2 m5 I. k; M3 p
  10.   inserted: function (el) {
    + K7 ^" O' C" Q7 I0 ?* b
  11.     // 聚焦元素4 R/ D( C; k' O" i0 f1 y
  12.     el.focus()' H9 K9 n( F! }: U  v
  13.   }
    2 E- i/ m. M1 e  D% w0 p# p4 H
  14. })
    : D( G% f; M, S6 m+ m( v( d
  15. // 创建根实例
    * }2 U: O5 e' ]6 L, q
  16. new Vue({( x/ D8 J$ Q: H. E* J
  17.   el: '#app'
      l$ \. Q. f$ |2 E0 @) z
  18. })/ A; P# P! ~: a8 C+ l8 |
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例" y8 h* c1 ?+ M6 q0 T
7 x9 z. h% M2 d. P
  1. <div id="app">
    % q4 K6 v. A" ?. {2 s
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    8 h  ~! C$ q. Z; t4 \- u
  3.   <input v-focus># p7 ]( t! E9 ^  j# N
  4. </div>
    3 B9 T: ?1 S. ]  A9 U1 l5 s* \

  5. % c% c0 M% B. C& h% R4 C$ {
  6. <script>% i5 V- v8 B2 r
  7. // 创建根实例1 @  D* R$ N! g. q0 r5 C. J5 S
  8. new Vue({- J$ C; x* T3 o* V+ b) h7 M0 i- k
  9.   el: '#app',/ o' s1 h# Y- W0 H2 \& n/ {
  10.   directives: {
    # s( n8 c7 Y1 E: U1 ]1 F5 \. a
  11.     // 注册一个局部的自定义指令 v-focus
    # q8 t/ i: o/ P! P  P; |& B
  12.     focus: {
    ( U9 p5 x9 l, j* e0 `2 F
  13.       // 指令的定义
    7 N' R2 L  N0 D- z) E: l
  14.       inserted: function (el) {3 [! Q. M2 ?& u9 \* L
  15.         // 聚焦元素( X' s2 Z4 d# |, p! }
  16.         el.focus()
    / J8 H) x: l, t" t1 C# Y+ b+ ^
  17.       }) K. o. o! R6 g' h9 ^- f
  18.     }, J7 T( z" J  z/ K
  19.   }
    + E3 k+ M8 }0 f9 G) ?
  20. })
    ; z6 f1 D1 y9 a. o( f
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    7 _* i8 }$ m, U/ [! m) d8 V6 _/ 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 }。
      ! K+ c* j. d1 a8 `8 f* }1 R- }
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    5 E: q0 |$ M5 J/ K# C' b; E" ]
以下实例演示了这些参数的使用:
实例7 g6 ]( [& K! X, L0 p0 {( F
1 {& a0 X3 y0 y  Z3 y: Y
  1. <div id="app"  v-runoob:hello.a.b="message">5 E) @+ H& p& p9 Q  x* m% g' d
  2. </div>: G" L3 Y5 t9 y/ |2 j! a; ^) o" \( K2 t+ b
  3. 6 E2 \( I: A3 N2 \
  4. <script>
    ( [# A4 }0 E4 [% @4 H; P4 O$ O
  5. Vue.directive('runoob', {
    - I5 w; H* ~* j1 M1 e3 k2 s
  6.   bind: function (el, binding, vnode) {, I+ P* `4 L6 c$ x. Q! e
  7.     var s = JSON.stringify8 A& f: _# ~* G* }
  8.     el.innerHTML =  B' ^( [; I1 n4 i( _
  9.       'name: '       + s(binding.name) + '<br>' +
    ! K3 k! t/ K, Z$ u' v* r
  10.       'value: '      + s(binding.value) + '<br>' +$ {! S. n1 _$ W, f# m
  11.       'expression: ' + s(binding.expression) + '<br>' +! K4 W9 t& M  S
  12.       'argument: '   + s(binding.arg) + '<br>' +
    ; ^' F" p6 U! \4 P* u+ Y* G
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +" g: {8 P, H( O5 n
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')7 |+ n4 v9 S+ X; a
  15.   }
    - f" E! o9 G6 \7 z9 ~& }* _  E
  16. })7 Y& {  k* \3 J# ~  L/ E4 m2 ]
  17. new Vue({
    , i" Z/ ^& U% v$ s  s* V
  18.   el: '#app',
    " A! t1 ?* S/ s/ [- V  b+ y3 F5 F
  19.   data: {
    1 A7 @; V6 c; i0 P! ?. h4 j( M( o
  20.     message: '菜鸟教程!'9 y; N$ V" p9 a! O8 \  _( U$ L
  21.   }2 J4 ~/ J, p3 T) {
  22. })
    4 u3 q3 W) j. @9 J; s" g/ ~- \5 _5 f
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:5 Y) i  y) w/ ^% a4 F+ `1 X
  1. Vue.directive('runoob', function (el, binding) {) @: w$ [4 Y- ^. \' q
  2.   // 设置指令的背景颜色) n/ D: B" D9 L$ z. E! x
  3.   el.style.backgroundColor = binding.value.color
    3 T. F7 X, Q+ E' o5 M
  4. })
复制代码

5 L' ^' J  M: f, W, t% M' w" z2 u9 p2 q4 {4 @. T# {- ]
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例6 f: y4 {+ |" X# ~% }+ O6 f4 C- Q' r
+ w% }- B$ R& M4 E: A
  1. <div id="app">
    . |& X" n2 O7 Z, c! I: W
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    & P( K6 i8 N4 Q& x* d) S
  3. </div>  F" T' @' O( x
  4. 5 x* x4 q% l9 K( S
  5. <script>
    - ]* g: V! H( z  J
  6. Vue.directive('runoob', function (el, binding) {& O" t* E$ V8 E" ^9 v$ W  u3 U0 m
  7.     // 简写方式设置文本及背景颜色
    7 i4 F: F0 k8 g4 _
  8.     el.innerHTML = binding.value.text% S: W! I; Z3 o
  9.     el.style.backgroundColor = binding.value.color
    9 q. }, y% _' q# Z) |/ C& n% a
  10. })
    ! J  K7 c6 s" f5 Z" Z
  11. new Vue({$ i) F3 t5 t3 I! N
  12.   el: '#app'. B# S' c* H, k- _
  13. })
    . U6 f. b% }# Q
  14. </script>
复制代码
/ Y2 s, q1 t- R" i8 g6 e0 N: e1 K

. F& _/ c2 l$ m) f$ k
( n0 _" c% q% L3 d. W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 15:16 , Processed in 0.049381 second(s), 20 queries .

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