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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

% O/ b9 C' A" R6 `- J
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例" [# X) C+ E7 b! Y4 W
+ t  J6 i4 }* u
  1. <div id="app">
    7 [% B3 l: a! @, d/ l
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    5 ?1 E# L( l# j9 ?! z4 f/ S& M  l
  3.     <input v-focus>" H! e: U" p/ z4 \
  4. </div>
    9 B7 e. t# T6 S
  5. 2 }  y7 z  d# Q9 g) r, P8 j  `3 t
  6. <script>
    ! }, Q1 [: j$ v2 y+ z
  7. // 注册一个全局自定义指令 v-focus
    " ^: w9 b2 X5 i* ~% ^5 h1 ~
  8. Vue.directive('focus', {% r6 j1 D5 ~' ^- f& N# G
  9.   // 当绑定元素插入到 DOM 中。1 b1 |3 H7 [) M$ P# X& {* d' H
  10.   inserted: function (el) {7 t1 `  Y/ x' I3 K9 p6 C) f
  11.     // 聚焦元素
    - D- x1 C$ @1 x
  12.     el.focus()
    " [# k# @9 @" \) ~/ a4 l
  13.   }" m" ?' l! ~9 Z4 g$ R
  14. })
    9 ?6 K& q+ M1 D, X; e
  15. // 创建根实例1 k3 o/ ]( |7 L+ a4 Z
  16. new Vue({$ M5 ?' M% a" a  Z% t4 e" @
  17.   el: '#app'* Q9 t+ E7 ~+ F4 R
  18. }). X8 h1 h4 u8 T% E* S
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
0 @; M$ z' y! t9 U- {% w* g6 @
$ V1 v: ]0 l. y
  1. <div id="app">
    % H$ V. M" n: D! p! e1 ~' g# a6 e6 e9 t
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    # g6 r1 @- {# w
  3.   <input v-focus>/ S$ h- H  f( T- r5 g; F/ t
  4. </div>! b* Y& x) }2 b# z6 u$ `7 w
  5.   @, G% m- R, |4 q! M/ p
  6. <script>9 i! V+ ]+ P8 G% z: @
  7. // 创建根实例/ I, `  k: B0 V
  8. new Vue({
    " M8 ?5 I+ G! n
  9.   el: '#app',4 W$ ~$ h- O" E( \
  10.   directives: {
    ! P9 Z1 K( s2 _2 }5 R
  11.     // 注册一个局部的自定义指令 v-focus
    ) O: |, O2 g, n8 a$ ^( N. }: ?
  12.     focus: {- E0 b0 @/ j$ I
  13.       // 指令的定义
    6 k0 s8 ]/ h+ x2 ^* J% k  u
  14.       inserted: function (el) {0 I; J% {! x( q- p1 I
  15.         // 聚焦元素. ~* c- Y" [$ K
  16.         el.focus()
    9 n( j; B7 [( k; u- p0 r1 I
  17.       }+ u( v3 d0 |9 ]
  18.     }& H. U1 a* |" j
  19.   }
    3 G. J& E: F% r2 x% m0 x; f
  20. })- |7 E5 ^2 h5 H# |+ j( F7 B, O
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    7 ]* _7 u3 _; e+ S3 D5 a
钩子函数参数
钩子函数的参数有:
  • 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 }。
      ' @/ e& p7 }& F
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。3 F& f: B2 R  z% Z
以下实例演示了这些参数的使用:
实例1 D" R8 p5 g  ?( E( a2 V1 f* V1 A

( W* R# s% T6 |$ u+ z' j7 l
  1. <div id="app"  v-runoob:hello.a.b="message">
    % o2 y/ S, S1 V5 x! |' b* J
  2. </div>' C4 n6 v( D: P% b) O7 g1 x
  3. " l. ?6 W7 }$ i  l0 _
  4. <script>6 q6 a) V3 e) z- a2 M9 Z
  5. Vue.directive('runoob', {( L8 }" x; q- @) q
  6.   bind: function (el, binding, vnode) {
    0 u" W5 I) ]2 y7 D0 v# C
  7.     var s = JSON.stringify0 X" r+ t1 z, Z9 r  ^7 ?. @
  8.     el.innerHTML =0 Q# Z* g) |* o% Q
  9.       'name: '       + s(binding.name) + '<br>' +9 O" S% j! Q, F! G( J
  10.       'value: '      + s(binding.value) + '<br>' +/ ~$ W% S' o0 x" b# O
  11.       'expression: ' + s(binding.expression) + '<br>' +
    + ^2 r4 Z9 o) f9 ^
  12.       'argument: '   + s(binding.arg) + '<br>' +9 X8 n, Y1 O1 l
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +' {- @- x9 {  \3 o! X
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    5 F- `1 N3 ?: M) o1 j# Q( I- c7 Y
  15.   }  u, I$ z, a; I& x/ Z/ C7 I/ r
  16. })
    ; V: d* W) J) N' M. D$ F0 f
  17. new Vue({
    % Z' j; {( c. F" g) t
  18.   el: '#app',; d0 r- ^9 R/ @3 C' o4 z: n
  19.   data: {
    5 `# L' |) o9 h, Q2 S
  20.     message: '菜鸟教程!': `- F4 u7 T2 ?9 I1 s9 D
  21.   }
    : ?: r; G' o+ x$ w, K
  22. })1 A7 `" |6 w, S( B& r0 R* C
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
- w' }7 n  x) e/ W7 N+ U  J
  1. Vue.directive('runoob', function (el, binding) {
    6 W. x' Z3 r& C. d
  2.   // 设置指令的背景颜色
    3 P- G2 m4 U- Y! e6 Z
  3.   el.style.backgroundColor = binding.value.color' e0 d" ^! d& r: _, _- d
  4. })
复制代码

) {! b" N7 O7 F! V( P5 G  u
7 \) g. \4 P( x$ l4 M! E
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
% c/ |* W5 |2 J& f7 `+ X% g) \) d: `/ L- z2 W9 S  V) Z
  1. <div id="app">
    5 H7 D7 p" l0 \0 d
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    ; ?' H/ l& Z: d6 r
  3. </div>! ?: S# B' a0 `3 H) e# _0 ]4 U5 Y
  4. $ Q  E; Q; k" ]# z. {) M
  5. <script>+ u" A* U" `/ {; |6 @( Z2 Y1 Q) a: P
  6. Vue.directive('runoob', function (el, binding) {5 y; K! m" v' v0 l; e8 [6 y) H
  7.     // 简写方式设置文本及背景颜色9 G" G5 R. Q: ^# u
  8.     el.innerHTML = binding.value.text. O8 d# o2 h: b  X* E1 E7 n
  9.     el.style.backgroundColor = binding.value.color# z: A$ C6 W& j# Q2 o/ M* e/ B0 p9 u3 y
  10. }): O8 q2 F3 Q; k% S4 g
  11. new Vue({2 N$ M3 O$ E" ?
  12.   el: '#app'
      y% _, i+ G" b5 J' B- T
  13. })
    % j) N& `! C/ L3 h% K- Q! g
  14. </script>
复制代码

' P6 q9 k& |8 l8 G8 K# g) N2 `8 k, M" k: A+ T
& a# z( ]$ i6 B! a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 19:02 , Processed in 0.072221 second(s), 19 queries .

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