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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
4 x0 d) F& v# Q2 ^2 o
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
7 U9 ^, C% }# [, D+ M' q, q4 p4 j
6 D0 {4 ]( i% N/ I; Z, ]: I
  1. <div id="app">
      c* M* K/ j! q6 N  Z3 D' _
  2.     <p>页面载入时,input 元素自动获取焦点:</p>) v* G/ w; J# Q) I7 }0 }( j
  3.     <input v-focus>
    * ~. f) m, f. m# z. t$ @
  4. </div>
    ) q* B2 j- p1 R0 [3 A; V% @: X+ T
  5. 0 y% T+ i% |- n. r) \- X* @
  6. <script>* o1 Z1 i- v, r6 Y8 T" ~
  7. // 注册一个全局自定义指令 v-focus8 [; Q" ?* S" Z+ I5 C7 @; u& [9 q
  8. Vue.directive('focus', {
    " _) h  r5 V& U4 G7 s
  9.   // 当绑定元素插入到 DOM 中。
    * {7 ?- Y- i; l/ Y/ Y; p
  10.   inserted: function (el) {
    * B. N0 _# N' p/ Q8 v; ~
  11.     // 聚焦元素% D$ x+ z7 W+ J6 m
  12.     el.focus()
    . P4 t, s0 S8 H/ \6 q& q
  13.   }
    8 B3 Q2 t( w- S8 S& A
  14. }); n+ ?3 p+ q; o9 }& O
  15. // 创建根实例6 O9 s) b1 Y2 C, [
  16. new Vue({
    , W$ @# y* w4 T# Y+ }
  17.   el: '#app': p6 y/ R0 G9 {/ `2 D; p
  18. })
    / I( @9 P2 z. {
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例, h1 S( v! r/ M8 {& U/ b

+ ?" p5 `0 {1 j4 C' G9 A8 k7 ^
  1. <div id="app">
    9 v0 n7 ?5 _6 i
  2.   <p>页面载入时,input 元素自动获取焦点:</p>. l6 C. W4 X( x, o# \1 e% ?: }
  3.   <input v-focus>3 ?, t6 l9 e7 T/ g4 t
  4. </div>' j; p+ G( T) \) O

  5. $ J( e8 Z1 T, l( H1 [5 M
  6. <script>& R! h3 E: G1 k+ m5 K' G5 f- W
  7. // 创建根实例7 g2 [5 C8 A) w
  8. new Vue({& h" b4 u: Y- w8 ?# U4 x
  9.   el: '#app',
    " I; Z5 @. N, c6 D' f8 X3 D: x
  10.   directives: {! \/ S* N! _/ b+ F5 `0 u
  11.     // 注册一个局部的自定义指令 v-focus" t+ [! n8 p4 }5 E+ R& r2 d
  12.     focus: {
    " J  i8 E7 }0 v1 [9 j5 R* x# v
  13.       // 指令的定义
    # ?! T# K1 U; V! ^9 h
  14.       inserted: function (el) {3 @6 s6 `. O% S: _7 T1 W5 k
  15.         // 聚焦元素
    6 k' l0 ~) p8 Y* Y
  16.         el.focus()' O# j* q6 n* j) P  \; x! s, G9 F
  17.       }
    8 s, R, K* [$ A3 t- L
  18.     }
    $ n' x- k% |1 |3 R% h; B3 y
  19.   }
    $ Y2 ?: e3 _- C  y' L7 A5 m
  20. })% e$ Y$ ]! X: w% l/ W1 Z
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    . q  [' d. r5 e% K2 k
钩子函数参数
钩子函数的参数有:
  • 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 }。
      2 Z2 h( D" \% t( }, v
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。4 B6 Q+ n+ O/ J3 d3 d  ^
以下实例演示了这些参数的使用:
实例
, X7 U( N, Q$ B5 b  R, ?
' B( k6 D8 ~9 j3 L
  1. <div id="app"  v-runoob:hello.a.b="message">
    - k) r1 Z6 j  l8 u4 M# U
  2. </div>4 s# d: S/ i% o4 q

  3. 3 \: J6 k! \& D+ h' w1 w: a7 S
  4. <script>- ~' C: [' ^# g
  5. Vue.directive('runoob', {
    , S; x! \4 p6 t! ~7 H2 Q/ ~5 Y
  6.   bind: function (el, binding, vnode) {/ x$ o' ^! u- I. w
  7.     var s = JSON.stringify7 t* [* M( Y" p* ~2 o  w# n
  8.     el.innerHTML =
    # Z& f  W# V# Z$ B
  9.       'name: '       + s(binding.name) + '<br>' +
    # m" T1 T! X9 g7 j8 P2 N) g
  10.       'value: '      + s(binding.value) + '<br>' +( @4 T: j" r  n2 w+ o
  11.       'expression: ' + s(binding.expression) + '<br>' +
    ; E# V0 Z/ o5 }. P& L! M. V
  12.       'argument: '   + s(binding.arg) + '<br>' +7 ^  v( y' _/ v: X
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +0 d7 e9 ]* v8 x, p, n9 D3 I
  14.       'vnode keys: ' + Object.keys(vnode).join(', '); `3 [2 Z' i1 W# e6 m& _( h) Z4 v
  15.   }
    7 [! _5 q5 P8 q9 Q; k8 n: e
  16. })
    8 T* s; i3 |( ]9 F$ g( b
  17. new Vue({' E' |3 t& B$ v: ^4 P& Z
  18.   el: '#app',* A& Y& F. _0 O5 [5 R& c# x9 B
  19.   data: {
    0 U, `) z* `- }3 t3 c
  20.     message: '菜鸟教程!'* b/ v+ U* U! e9 _8 I
  21.   }
    9 ~, _' y) B9 `8 p: Z, u0 o
  22. })% k$ f( n$ \1 ~8 P
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
% j: L6 }& i6 [7 y+ D7 F! T, K
  1. Vue.directive('runoob', function (el, binding) {& M* M/ e! y4 w
  2.   // 设置指令的背景颜色" F4 k  b2 \# t* }( H4 O9 d1 z1 a
  3.   el.style.backgroundColor = binding.value.color( F6 Q, B1 @, {! E0 ?- f' i, c  X& e/ q
  4. })
复制代码
+ e: |/ Y; @) z& r
" x% n$ `7 U/ k3 ^
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例& g9 Z7 z% f% U$ |8 v  t
' d. D' p. u5 y+ }9 z
  1. <div id="app">
    1 R2 _& d* r+ K: |
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    ) z. n% d1 j: x1 F
  3. </div>! a5 Q( e& M' ]  W0 j" V
  4. # s  a! P8 ], T0 I1 ?( n) J% L
  5. <script>
    3 q( ?7 ?7 b4 f+ V
  6. Vue.directive('runoob', function (el, binding) {) }7 V3 R7 k2 ?% x
  7.     // 简写方式设置文本及背景颜色$ R6 x3 o0 U+ l- g# t# R2 \: Z
  8.     el.innerHTML = binding.value.text
    0 j  Z% P0 o1 C1 ?8 i0 {- @
  9.     el.style.backgroundColor = binding.value.color) ]9 l4 A* ~* a
  10. })+ o2 `1 F( z4 K0 O8 z# r; K3 L9 I& V
  11. new Vue({
    4 \' g. A4 ^! L2 c/ j! w
  12.   el: '#app'
    * h- T* z- w7 M; T' [4 v' s9 h
  13. })
    . r# @! U  B" e* ^: `3 F
  14. </script>
复制代码

9 B6 D( X0 i! Y( B% z. Y1 V& q+ V* h1 d5 E
/ d/ t1 S9 R9 e) j5 R* y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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