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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
' i8 f$ E( @: Q  B7 f9 j
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例1 I6 {( c/ l$ i+ v- l& ^5 Z) v% A
5 H! n. j2 Z$ x% v% ]8 `/ j
  1. <div id="app">8 t4 X7 g  Y0 o" Z
  2.     <p>页面载入时,input 元素自动获取焦点:</p>3 H9 x: S7 n, M* f3 Q+ z, @' ~1 G
  3.     <input v-focus>. Y4 A3 P" J6 U; s& F( L
  4. </div>- o8 z3 F8 i0 B

  5. 7 X  I9 N" C' Y* C2 G. n4 c5 b) W
  6. <script>
    * j/ |( l) @( j
  7. // 注册一个全局自定义指令 v-focus  u  l2 i9 R! f# _7 `( M
  8. Vue.directive('focus', {
    6 s' k# E3 z* ?
  9.   // 当绑定元素插入到 DOM 中。
    ; r8 w/ H' Y5 d* |7 X" s7 q& |+ K
  10.   inserted: function (el) {
    5 B9 _) k8 K8 f
  11.     // 聚焦元素- k6 ]3 C$ c# g/ R. A" P
  12.     el.focus()6 r1 N2 Q, v8 w% c( N
  13.   }4 M1 C8 M0 n  i" k
  14. })5 f6 n) @) L2 w$ u8 @( ?
  15. // 创建根实例
    & P7 v) z0 Z9 Y' S0 [3 k! I5 A6 H6 D+ L
  16. new Vue({7 b, Y( [: \# V
  17.   el: '#app'! _, F" O! l  y
  18. })9 [9 ?, Z! a: K% q1 A, E
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例5 I* x/ d2 F: p! a* m- s& w! ]

) Z* T7 A) z2 a( Q! ~
  1. <div id="app">1 P+ E' H% c" y* @
  2.   <p>页面载入时,input 元素自动获取焦点:</p>0 U1 e3 j. H6 \& a* l! v$ ]
  3.   <input v-focus>, o& z( d; Q- q5 ^0 Z- D
  4. </div>5 C& L3 k( g3 L9 |" B
  5. 3 ~6 }+ o& F: e) x3 e0 I
  6. <script>, K  ^! L3 M: |0 W6 \* d6 W6 q( Z
  7. // 创建根实例3 u; B4 P: g! }
  8. new Vue({
    , Z# d, U' k2 Q9 U( k0 w
  9.   el: '#app',3 b, s/ |2 C: L  `
  10.   directives: {' V- B# k! \" Z
  11.     // 注册一个局部的自定义指令 v-focus1 }* B$ L; h4 |
  12.     focus: {% d5 \3 V1 \9 H* S
  13.       // 指令的定义
    3 s* v" X+ W4 u5 I, `) B5 A# H
  14.       inserted: function (el) {7 T$ k7 P  Y0 r, i
  15.         // 聚焦元素
    ' F; |: j0 O0 B6 D% ]7 D$ ?! W
  16.         el.focus()5 N/ f  J: x) d% S
  17.       }
    5 H1 F) n5 s( q5 L
  18.     }
    7 G5 X  G. ]9 N3 e$ s- o& s% ]
  19.   }
    3 H" h: R( A3 Y; ]) x7 Q; G2 f
  20. }): s! `; y) o( m* c" B. b
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    ) L+ M% H+ H4 Z' K1 y
钩子函数参数
钩子函数的参数有:
  • 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 }。
      1 g& I- G) w2 w& X
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。- C7 m9 N+ ?) D3 k' j
以下实例演示了这些参数的使用:
实例
& H; j. @9 M' V; o. q$ E% C$ O2 V8 W( V9 _. N; }
  1. <div id="app"  v-runoob:hello.a.b="message">/ v9 j$ p" b4 U+ j+ i
  2. </div>6 Q9 ^+ u& w, _9 \) M

  3. 2 i, E* A" q7 g4 ]8 m8 U# s$ t9 |
  4. <script>: |7 W* f% ]6 G% V" R
  5. Vue.directive('runoob', {
    " {9 U3 w5 l/ z2 ]# Z3 [" ^
  6.   bind: function (el, binding, vnode) {5 m/ C1 S7 F. k, N
  7.     var s = JSON.stringify
    ' w( k8 s0 f% U# T: ^
  8.     el.innerHTML =2 _9 n1 P* X! c9 E$ o! }) f
  9.       'name: '       + s(binding.name) + '<br>' +$ ^0 T) b) G) T3 [7 x5 L
  10.       'value: '      + s(binding.value) + '<br>' +
    # a1 J( D: ^; l$ f8 @8 i* H
  11.       'expression: ' + s(binding.expression) + '<br>' +" F0 h7 p: Q. u) D$ b8 C& h  z; v
  12.       'argument: '   + s(binding.arg) + '<br>' +
    ( A" M% o' f( c; t9 m; C8 X# f
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +5 E6 a7 O; J, ?% R
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    9 g7 G2 Q, q: b# w" k$ b4 J& h, t
  15.   }
    0 w2 n1 }4 D4 |1 e# c$ W; ?
  16. })3 n! a, k3 @$ ^; @* `
  17. new Vue({
    * T1 V) l5 I; y1 y. `
  18.   el: '#app',2 R2 i/ Q$ X8 F
  19.   data: {7 I" m4 v5 u5 b! n
  20.     message: '菜鸟教程!'& A/ p" v/ ^2 E$ \, p9 c
  21.   }: @) b" V+ v9 A7 D- f1 Z
  22. })  S$ Y- ?: f" a8 G; i' R
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
2 B8 I; K. q, q) d: P1 Q! W' ~! ~  P
  1. Vue.directive('runoob', function (el, binding) {  l+ _+ n9 Z& O; u
  2.   // 设置指令的背景颜色
    # l: O9 S; o- n& \4 G
  3.   el.style.backgroundColor = binding.value.color
    / [9 h+ |% Y% ?
  4. })
复制代码

& o4 M& W6 z1 L9 d$ t
/ s  M- N9 v# K( [% r& E. m
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例& d' O" z/ O" X" E3 j4 U$ N
1 R) ?% ]  g$ x% [
  1. <div id="app">- u2 R/ f. p7 a0 ?, e
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>$ Q* C7 ?  R/ G6 R2 W) A9 O2 W; ]
  3. </div>$ _2 u/ y, D1 Z& |
  4. : k6 F2 K; t  W( ~% X& F
  5. <script>" |' Z" w$ \' _& l* M  j
  6. Vue.directive('runoob', function (el, binding) {
    ! j! T" y% M: x6 M: Y; @$ M
  7.     // 简写方式设置文本及背景颜色: r; Q* L/ Y5 R, X" ]
  8.     el.innerHTML = binding.value.text
    ; i( r- o9 M6 p; M- H, Q$ ^
  9.     el.style.backgroundColor = binding.value.color
    % V) O# a) I+ }0 G9 m1 J
  10. })' V; S# |9 i! ~( O$ e
  11. new Vue({! F. Y, S. W% ?7 |
  12.   el: '#app'; m1 H" \8 _( w* a. @: w5 U
  13. })/ g$ S9 e# A. L& ^
  14. </script>
复制代码

9 r. ]- H+ y) l# ~/ u4 O, N* ~% v4 E& _. U4 O* q. B

$ ~. B* J; {  U3 P8 q2 i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 21:36 , Processed in 0.126921 second(s), 20 queries .

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