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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

5 h- H7 i0 R0 [4 ~
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例5 T4 s: g% e2 Y+ v1 c, ]' h5 b
& _# u3 a0 G1 ~/ Y) a% w# P9 |  q" N
  1. <div id="app">5 Q- w) {( `/ C' b8 z, Y: @
  2.     <p>页面载入时,input 元素自动获取焦点:</p>2 l3 A5 {7 ]: u! c  K, s/ L6 W* X
  3.     <input v-focus>
    : t5 ]$ h$ n6 S- w" b
  4. </div>
    0 _; b" V" ]6 ]1 n: M0 Q
  5. 8 v' B$ ]! ~3 |' S- Y1 ?
  6. <script>
    5 c" t0 c! R3 t; M3 `: X5 r
  7. // 注册一个全局自定义指令 v-focus
    . N$ ]* Q+ ?! `: D: x0 O" ]
  8. Vue.directive('focus', {; h& J' D) Z  |, }7 a
  9.   // 当绑定元素插入到 DOM 中。
    / N! j: S. X/ _# F: Z& p+ p. h, G
  10.   inserted: function (el) {
    / I/ j9 P0 ~. u$ R6 K3 ~$ h
  11.     // 聚焦元素5 Y- M  g6 o! v5 R. d: A
  12.     el.focus()
    ! @( H: J- g. o: r4 N" I1 n' H5 E' W
  13.   }; ^0 I# G* F) }4 l  ~5 M8 q
  14. })) ^9 t! ~0 @( r) L& T) d9 {# _! ]
  15. // 创建根实例
    1 Z. O' {) x  c, C* ]% b. j( J
  16. new Vue({
    " q7 N# n+ a7 y  I. e' z
  17.   el: '#app'
      |# A4 ?- y" ?* w' w
  18. })
    : v0 }: f- d; q1 A& A. \/ p
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例  ?2 f, R/ G/ x6 d$ @
4 V, i( x! I- V! Q& \& F
  1. <div id="app">
    ! z8 ?% ]  L* x$ J$ Y8 v: k9 x$ }& \3 Q
  2.   <p>页面载入时,input 元素自动获取焦点:</p>2 ^* M4 [3 V; D
  3.   <input v-focus>' A& x' }& r+ f; ^8 Z1 K
  4. </div>0 X" D- I! ~' Q9 V

  5. , [8 c, {2 \7 G2 |: d4 a; f3 P
  6. <script>7 l- k$ i/ I- }4 d0 K- J: ?
  7. // 创建根实例) [- w) _  o! {; w
  8. new Vue({
    0 N- Y" {: v7 i. l/ X' Y; F& {9 Z
  9.   el: '#app',9 Q. H2 G+ ]) c1 H& V+ F$ s
  10.   directives: {7 Z5 g! D& J# j1 M
  11.     // 注册一个局部的自定义指令 v-focus
    ' e9 o1 o  F  z( |
  12.     focus: {7 x7 o& j! c* t
  13.       // 指令的定义; T2 J4 G  @: r% j/ D  @
  14.       inserted: function (el) {
    $ L  w$ O( d4 W6 p
  15.         // 聚焦元素
    2 J4 ?6 [  w: v" {
  16.         el.focus()) ^) K$ d7 O) ]6 ?
  17.       }
    " p- R3 K3 X/ R/ l  I5 \: p( D
  18.     }
    ! O! j2 U; U+ `( ]. U6 H  d
  19.   }* Q$ A# }2 h' `0 y! b
  20. })5 r6 {; i/ R  x0 s0 K4 w
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    9 p9 B2 Z9 H% E4 d  {* S3 p9 c% l
钩子函数参数
钩子函数的参数有:
  • 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 }。
      0 i9 S+ x% E% A/ B2 _
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    ! j% l" _! ^: O/ h; z
以下实例演示了这些参数的使用:
实例4 b; o7 r. ~: d* i& ?6 Q

, \2 L! d. I& x
  1. <div id="app"  v-runoob:hello.a.b="message">
      _, X7 F) q# E' \
  2. </div>! s" [& |: q/ I; C0 H, Q2 ?( M. }3 A9 v
  3. $ ^1 G! T: a& F4 ]
  4. <script>6 ]' _, l3 t& @9 ?* \' U
  5. Vue.directive('runoob', {& y  E4 l  s! s. [1 L
  6.   bind: function (el, binding, vnode) {
    3 n; c; I+ C8 B/ P) i  M. A
  7.     var s = JSON.stringify/ g, w/ B0 V. O5 o( L$ @: m  F
  8.     el.innerHTML =
    & ^2 {! ^8 r6 I/ N) i5 I
  9.       'name: '       + s(binding.name) + '<br>' +
    * ^& r: f  j1 R3 I5 q+ F
  10.       'value: '      + s(binding.value) + '<br>' +/ ?( t. G. w/ u: v' E0 Y  Y
  11.       'expression: ' + s(binding.expression) + '<br>' +
    2 O' V) Y% N+ w# B2 g
  12.       'argument: '   + s(binding.arg) + '<br>' +
    9 f7 k$ K. u& [5 w7 A
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    / ]5 C! g+ K# ^7 u0 e2 x
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    9 ]  [/ [; R) h$ O
  15.   }9 m( |1 B  m( k- a7 s9 K* b$ B8 B
  16. })
    3 d% B% w; [: E$ p+ x, r
  17. new Vue({0 f1 X5 R6 Q& Y6 q) K
  18.   el: '#app',2 _/ V, P% d- n3 X9 d6 v
  19.   data: {' k; f* E9 e2 N, W/ h% g3 ^
  20.     message: '菜鸟教程!'' e- q& z2 s- o: d
  21.   }6 o; F7 K, `6 I- i- [+ q6 q: p
  22. })4 E5 u$ `: V4 B/ ]! I6 _
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
) [  v9 `8 ?( \7 a3 M
  1. Vue.directive('runoob', function (el, binding) {
    3 Y- I5 n0 `% s
  2.   // 设置指令的背景颜色  T* q6 x  l2 ?# ]& f' C4 Q5 C
  3.   el.style.backgroundColor = binding.value.color
    - U% m. w$ L  b4 p0 Y9 Y+ x' B
  4. })
复制代码
' T3 n! h+ ~' b1 }
; j/ ?5 S. G( n1 ?
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例4 G/ C* N1 A3 L6 l6 c5 A6 d+ H# h

- V6 R' p6 \" Z+ B+ z
  1. <div id="app">  C! i6 }0 V& r& s
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    ; a2 E9 n% e+ O9 x0 U6 d( E
  3. </div>
    - ^7 H3 j# y9 H

  4. + O' x$ z: |3 P# c  l
  5. <script>8 F; T$ N' P/ b. k, q+ g! t
  6. Vue.directive('runoob', function (el, binding) {2 `* p9 c; Z5 @' q5 N
  7.     // 简写方式设置文本及背景颜色
    % q, E1 t4 B* f- e
  8.     el.innerHTML = binding.value.text1 z6 K. j1 N& ]% l! _
  9.     el.style.backgroundColor = binding.value.color
    1 q9 o7 s9 r4 A+ f
  10. })
    " p8 D8 l) {8 T  m6 M
  11. new Vue({- B  Y5 N. ^+ R5 n
  12.   el: '#app'
    , `- z% }; U, n; m* G' r8 N
  13. })
    , X7 I7 i! \. `" `1 S5 `
  14. </script>
复制代码
# Y# S8 L+ W: r: |5 D
# T! R+ @; x+ O0 j  f9 g5 Z
" B2 x9 ~1 c' P+ m; A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-23 02:48 , Processed in 0.117592 second(s), 21 queries .

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