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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

: G5 \6 F- k2 r! _9 Q" F0 ~- \4 I
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
7 x, J9 l4 b* A7 }5 W- P8 f
( B# |5 Z4 Z/ r* z
  1. <div id="app">
    ! e# ?% g7 ~$ e; y
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    1 \$ |7 y4 A! |/ M$ _6 A4 L
  3.     <input v-focus>" `, C$ t9 e: M- G
  4. </div>
    - N% s+ K3 o/ v, G8 n. o2 b! f8 z
  5. ; c: F; S  a+ W
  6. <script>7 e, ^5 f$ ?( z# q9 F
  7. // 注册一个全局自定义指令 v-focus
    / }4 A( O- N- j4 @' M/ i3 s4 L* R' X
  8. Vue.directive('focus', {+ Z% \' V  o' `: S1 [
  9.   // 当绑定元素插入到 DOM 中。
    & o  @+ Z$ |) M. ?8 U$ B  J$ A* D
  10.   inserted: function (el) {  p) }2 F4 F  V2 H; ]. k
  11.     // 聚焦元素9 h; J: S1 [) i! b
  12.     el.focus()- }8 |, P5 h, ~+ ]8 T& K6 V
  13.   }
    3 b2 P1 u& A$ ^/ s( P3 g
  14. })
    2 q7 @- O  E1 ^8 U4 ~4 s1 K0 ]
  15. // 创建根实例
    ) ]& ~, Q) L. p8 o. q
  16. new Vue({4 q( t! D4 _# o" I: ~' j, M( {
  17.   el: '#app'
    ! R. C) l) X: K
  18. })
    2 j( J# Q/ L* T" ?0 T+ c
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
$ f; b, s6 g! j4 \- q
- C# L% P0 n( `* ~- [; N% g0 H. S
  1. <div id="app">  n3 G+ E  E# w1 b4 |3 X0 T' H0 e% u
  2.   <p>页面载入时,input 元素自动获取焦点:</p>) g' c$ r+ Q, K. Q* }
  3.   <input v-focus>! D9 c# O: ?& h) J
  4. </div>: A" H8 |+ |1 h% o, ^
  5. 6 d* c, u' a; v( W& _
  6. <script>& H" w- C; [1 w
  7. // 创建根实例
    ; f( _, h8 C" l3 }
  8. new Vue({
      z) n, e" u; ^" D) ~  ]; O
  9.   el: '#app',/ e) ^5 v/ E3 }- I# n- x7 \- s
  10.   directives: {
    # H- C* o! p) b4 H
  11.     // 注册一个局部的自定义指令 v-focus- V8 _5 w( Z$ @( j; A
  12.     focus: {% h0 ~2 j. J9 j$ g0 N8 E2 S
  13.       // 指令的定义
    * o. v  X# i$ h5 o1 `, S
  14.       inserted: function (el) {
    - E* A' W4 e% X; q2 Z$ `( V: p
  15.         // 聚焦元素
    2 {# T, p/ l/ w- r/ M9 v
  16.         el.focus()0 s& D1 f- c, d/ T- R
  17.       }5 H6 R3 W- M( Y/ y9 z
  18.     }
    ( O5 b' r1 Z! ]- V4 R
  19.   }) C1 c4 K9 Z4 |: M: [9 V
  20. })! j4 Z# h9 n, ~( e/ ?2 _
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    " k8 }" \* ]# v' _0 N$ [
钩子函数参数
钩子函数的参数有:
  • 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 }。* z; K* b2 s. w1 m  G. p  v
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    , l" N* B! M. q) p6 \/ _9 m
以下实例演示了这些参数的使用:
实例
2 a# x0 j( H- ]4 R- i+ n. w3 q, P. m3 t( l2 w4 @. e
  1. <div id="app"  v-runoob:hello.a.b="message">, d2 t: w# k4 J# J* `7 R
  2. </div>
    $ F+ O$ f' d6 l, `+ {% u

  3. % q5 H: L, a  T0 A2 G- ~1 E# M
  4. <script>& f0 {  @3 L% X1 B
  5. Vue.directive('runoob', {
    $ }* Y: @! f  B8 k+ y: @7 l
  6.   bind: function (el, binding, vnode) {# p; \9 z& U# Z" Y: p
  7.     var s = JSON.stringify! Q7 @: T- `5 a: O. H0 M+ k
  8.     el.innerHTML =! o6 l& r* O/ y! y6 V6 C% A& z
  9.       'name: '       + s(binding.name) + '<br>' +$ F3 p8 L1 _% b) Q% I
  10.       'value: '      + s(binding.value) + '<br>' +" B7 Q6 l% R3 l
  11.       'expression: ' + s(binding.expression) + '<br>' +
    ( \% S0 I" p3 Z, C- ~
  12.       'argument: '   + s(binding.arg) + '<br>' +
    ( E3 Z4 N' V) s- t2 W! Q' Y+ i
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    1 D7 D4 I  \5 B6 H! F( ^
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    + z2 S2 s9 q/ ^
  15.   }
    % c5 |6 v& O$ c% I, l
  16. }), |. w  {; O# J0 ?& v
  17. new Vue({) y3 O' N" X! n7 m6 @# D+ T
  18.   el: '#app',  h+ m5 \/ E) c4 P, c/ T
  19.   data: {
      [: k7 q0 c! U6 f- q
  20.     message: '菜鸟教程!'4 |2 ?+ x8 S1 p6 l2 c
  21.   }
    0 m6 U: |! s( j
  22. })1 H2 k1 C" O0 }  C2 \+ \
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:8 u+ ?6 r6 D1 a
  1. Vue.directive('runoob', function (el, binding) {: {. L) b6 i2 `. \- K$ L
  2.   // 设置指令的背景颜色
    3 s: c0 k/ D# e7 n6 c# \) ~
  3.   el.style.backgroundColor = binding.value.color
    ( h- Y4 G" S, |
  4. })
复制代码

8 x% e4 K7 D9 {
6 S& U. D( B$ U- U; C$ O! U+ ?
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
3 @" C( `$ v# r7 ]2 m$ ]. R) e5 a' E
' h- t+ y2 n- e2 j9 N( i- b
  1. <div id="app">
    : B, X5 `9 o) W7 t1 c
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    , T0 u( G" T0 N3 y' c
  3. </div>
    / [( D$ v3 g0 |" v9 o: o

  4. $ D0 ]" {& X* m2 |
  5. <script>
    # v7 d6 f& S, k, W9 ]" K
  6. Vue.directive('runoob', function (el, binding) {
    $ ^- T& e. s+ G, f
  7.     // 简写方式设置文本及背景颜色6 u; A' a) A6 L# ?
  8.     el.innerHTML = binding.value.text  ]) a- E- x6 a. u
  9.     el.style.backgroundColor = binding.value.color+ P' a7 n0 E7 m- O, `8 M
  10. })% f) Y1 m$ ^- e9 d
  11. new Vue({# T1 k' _# _! {5 c1 d
  12.   el: '#app'
    3 r" F" o! F% O
  13. })
    % F' _& y. z, r: t; J; N: j
  14. </script>
复制代码

6 F' @) B: q* `. e7 q0 F& d- P" ~' H0 F1 j1 |9 o6 k; s) V
3 ?1 `2 o2 m7 R8 F5 m3 z( f" B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-5 00:00 , Processed in 0.051928 second(s), 19 queries .

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