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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

) F7 \3 Y7 i0 Z- q) i* t* b2 O
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
  R: q$ K7 V; C
2 z6 d# n( h) r. y
  1. <div id="app">
    5 `% a% W( Z, U; s. r# f: G5 a
  2.     <p>页面载入时,input 元素自动获取焦点:</p>4 n" v" ]* l* R8 i% P4 V
  3.     <input v-focus>( G$ }3 y1 {$ S& O3 P4 a5 q
  4. </div>
      n2 ?! Y; p0 u; Z

  5.   K: i. ^( V. N7 Y
  6. <script>
    ! |, `, {* R7 n/ p/ C( A
  7. // 注册一个全局自定义指令 v-focus( i* _1 i0 n; S9 D. v
  8. Vue.directive('focus', {* x9 p$ ~) y* V3 N$ C
  9.   // 当绑定元素插入到 DOM 中。
    : v) {  [7 [" l
  10.   inserted: function (el) {3 P6 [- U& S5 r* v. ^. K
  11.     // 聚焦元素8 ~) J! J4 a3 b8 D8 e$ {/ a" }
  12.     el.focus()
    7 K) A2 f5 d9 x) x& I- F9 j
  13.   }9 K, x7 P3 g6 X/ _+ H* j
  14. })
    2 ], {- S! k3 z8 F, ?0 O
  15. // 创建根实例* W# K! d; z3 U& t# t* e' f7 X# O) y
  16. new Vue({! r+ T/ T, p. p0 D" y( {) u
  17.   el: '#app'3 k! y" s6 d: T& s* q
  18. })
    6 b- b& [( F  v! V& J5 j; a( y
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
; Q  c0 ?# W/ n; ?) ]
& J/ a8 J) X. B/ s8 L$ Q/ i/ v; q
  1. <div id="app">
    ! ]$ o0 t6 `9 _: _  w
  2.   <p>页面载入时,input 元素自动获取焦点:</p>) n# e, e- K- ~) R1 @# \) E: Z
  3.   <input v-focus>
    : X" L" Y9 _. B3 p( a
  4. </div>
    % u' v6 ?1 s, O
  5. 8 k% T* n  u  w
  6. <script>
    9 R' u" d  V7 X" C4 |( l( l/ I
  7. // 创建根实例
    0 ?- `1 T. A, n$ r8 V
  8. new Vue({
    9 @9 q! A0 Q4 ~! R1 u1 M
  9.   el: '#app',& D+ d+ S9 i3 F( P
  10.   directives: {3 |  A+ u3 A. L' A& U3 h
  11.     // 注册一个局部的自定义指令 v-focus
    , m- D9 v; t% m0 J1 C8 G& v" A+ a
  12.     focus: {- h. f1 g7 t6 I! X
  13.       // 指令的定义
    , q5 h' E, W( j* a6 e
  14.       inserted: function (el) {% B) b! h4 [0 u7 x& ?$ F6 N, [
  15.         // 聚焦元素+ R$ d9 L# s- w
  16.         el.focus()" V' \0 `: K2 M- U9 \
  17.       }" I' L1 D* |7 ?! X) S) y9 M, f: \2 K* A
  18.     }
    ! o1 m4 Q6 b/ D
  19.   }
    8 H. L3 _3 X" `4 U2 X. l
  20. })+ D+ l" u  h1 b$ s8 {, |
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    0 u1 B: `2 m% g
钩子函数参数
钩子函数的参数有:
  • 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 }。+ R) X1 ?8 i; w; ^% ]0 ]
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    ( L+ ~# n  G* \* J( q! y
以下实例演示了这些参数的使用:
实例
' @" U: j' T) }( d/ {6 S. M' ]0 `: W. p  ~# F5 f! ]( J
  1. <div id="app"  v-runoob:hello.a.b="message">$ x9 \, R) M1 {' r) G
  2. </div>
    4 S) J/ Z) c) i% K& t+ h: H
  3. $ L0 _) T0 \1 }6 H7 k; y& A
  4. <script>  j. g% u7 o4 \5 G! {' \. J, p
  5. Vue.directive('runoob', {& P% n5 W, k+ s% m) F9 g0 @5 x
  6.   bind: function (el, binding, vnode) {
    # a/ d* B; u- ?, Z4 E) S
  7.     var s = JSON.stringify" o+ x1 \, P. h0 b( x8 p
  8.     el.innerHTML =3 W0 K2 l7 F$ q4 X& k+ m
  9.       'name: '       + s(binding.name) + '<br>' +/ ?9 {4 r" w. L( r* s8 `3 r* w
  10.       'value: '      + s(binding.value) + '<br>' +
    ( Y, M5 e' \! H
  11.       'expression: ' + s(binding.expression) + '<br>' +0 `6 x* t2 C4 l: g' G1 y! b
  12.       'argument: '   + s(binding.arg) + '<br>' +
    . @6 U9 V6 V) H. W& C% [. v* V/ Z# K
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    & m' G/ n& F. h; I( ~- L
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    , s1 r6 o- [3 g3 z5 a
  15.   }
    6 w( S3 _( x! E6 y/ R+ P
  16. })9 @' X2 x$ K: Y$ a+ ~( V
  17. new Vue({: I+ v$ ~8 i: t4 D  c2 l8 E+ ?/ Z4 i
  18.   el: '#app'," n( ^8 Q7 d. z4 [8 c
  19.   data: {
    8 O8 }! M1 m4 A  e
  20.     message: '菜鸟教程!'
    " ^  V1 z3 O1 g  N1 T: Z
  21.   }
    0 L7 E- v7 b; t' l% v* s
  22. })8 I! ^, d' K) n  U
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:9 |7 T3 @4 t& o* Q5 r% F& L6 X
  1. Vue.directive('runoob', function (el, binding) {
    8 F* `7 F: u* S8 c. Y
  2.   // 设置指令的背景颜色* c; o4 L  ^! @$ G' t0 M* m* W/ E
  3.   el.style.backgroundColor = binding.value.color: c( J- ~- o7 r$ z. y1 x
  4. })
复制代码

5 d! r& X  l5 K! d3 O) f, }+ M+ l6 o* |5 y; L
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
+ J! n) V$ b1 }( [  m" G5 _# ^& ~% d" D2 u+ S
  1. <div id="app">- {5 S, l- j9 U  R, t" J6 k3 {
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>( H8 ?- e( }. P
  3. </div>
      S' l4 k7 J  H4 p( s3 ~+ ~; j* P3 G
  4. , a: J* V6 B( W
  5. <script>3 w  j% c! ~2 Y5 p6 N0 K9 G) _
  6. Vue.directive('runoob', function (el, binding) {3 |- C) o3 q3 a/ q
  7.     // 简写方式设置文本及背景颜色
    9 \9 i: L3 g- L" D
  8.     el.innerHTML = binding.value.text
    4 n+ i+ Y2 O7 q6 `  p. ~5 l  a( f
  9.     el.style.backgroundColor = binding.value.color
    7 \  X, _3 u, X+ N6 [  g: D
  10. })
    0 j( t" n# T" M: Q0 z5 F/ g2 F( m
  11. new Vue({( e& u) ?0 C9 Y8 y
  12.   el: '#app'; m( J. ~! x  `5 n9 h  T
  13. })
    ! V9 z4 `. J4 P1 w  r8 i& n1 e
  14. </script>
复制代码

6 v: @. c3 M$ a+ @7 K; j! C6 h# M( P* ~  g  g

6 I3 Y# g0 L, F; ^' k0 U/ U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 11:32 , Processed in 0.076535 second(s), 19 queries .

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