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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  H5 a8 f5 e6 u& s
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例$ E6 O& R! W0 d- K/ @8 K
, |- l7 n0 |9 X: e4 P+ c1 H
  1. <div id="app">" \) D+ Y9 {, D
  2.     <p>页面载入时,input 元素自动获取焦点:</p>7 G; ]6 V' [" n
  3.     <input v-focus>& O% H  o0 Z6 z' B- L
  4. </div>7 w  B6 O+ `8 B5 p
  5. 5 C* M# H, |- z4 p& z+ e3 e7 n7 W
  6. <script>" l9 ?7 i7 L1 \% s/ D  z
  7. // 注册一个全局自定义指令 v-focus
    % X; b% ?5 a  ^2 C/ L0 p
  8. Vue.directive('focus', {  u8 P3 h) y9 i! S$ C
  9.   // 当绑定元素插入到 DOM 中。
    # }. J6 ^8 C; a" g  c0 F, l
  10.   inserted: function (el) {
    0 w# h5 D% S9 A, N
  11.     // 聚焦元素
    ) N- ?, L/ h" B* e
  12.     el.focus()
    . j$ s& y9 U1 k, s  l" r3 f4 |
  13.   }( M( y) m- i0 g" P7 ]
  14. })
    4 a. E9 s" N4 J5 W9 V
  15. // 创建根实例
    , A. s6 H8 S4 t
  16. new Vue({
      C0 A- c4 [1 r' Z" m5 H
  17.   el: '#app'; P& X+ b# ?0 ?% \0 O( B) H  P
  18. })
    . F+ M. B7 Q/ h+ ]2 ~2 x% i( `
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
$ }) Y$ y- H7 n9 E! U; \5 a' m* e  `/ Z" T7 M7 ^
  1. <div id="app">
    & J8 I- U7 r7 C5 c+ D' y
  2.   <p>页面载入时,input 元素自动获取焦点:</p>  a, k  s% D/ ?1 ^1 v: V; z% E
  3.   <input v-focus>9 Y" C' k8 m) n1 ^+ S
  4. </div>
      h; X9 T3 n! g' l2 u) v
  5. 3 M3 Y& d$ c0 p' S( U
  6. <script>: @1 u7 L( e  j" t. @
  7. // 创建根实例* g: b/ n6 V- n$ K# J. v; u
  8. new Vue({
    2 h* H0 @1 A+ K7 z. ]
  9.   el: '#app',
    7 j/ J) |9 {: J- V' G1 r
  10.   directives: {; F  `0 x/ y. E/ J5 N9 \' m! e! d8 e
  11.     // 注册一个局部的自定义指令 v-focus1 @  R7 M: c- u1 P4 _9 a
  12.     focus: {% y2 x" [3 A4 U. k7 s. E# j" i4 o
  13.       // 指令的定义
    ' w2 z! G% ]; ?+ I1 y
  14.       inserted: function (el) {- S' Q! e" m0 v3 |# p
  15.         // 聚焦元素
    * Z" Q# O, N, R- ]  O
  16.         el.focus()6 ^& ~: l) U3 E1 J
  17.       }
    - B8 O0 {; d2 k
  18.     }# [1 o5 ~$ P+ C: T8 k
  19.   }
    8 h$ N# u: @! K5 d1 j
  20. })
    9 F% v( v# t8 P( f3 L# i- U: @: E- p
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    ; S1 [; ^# r" ~! ?0 ?# y# C, F7 E
钩子函数参数
钩子函数的参数有:
  • 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# g/ z- ~9 A0 I
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    $ z* i9 P7 ^7 o8 I- ?/ r
以下实例演示了这些参数的使用:
实例
2 X% c+ Y* G: A1 \$ x2 w+ v2 y% l9 Q1 d3 E6 p; L
  1. <div id="app"  v-runoob:hello.a.b="message">
    : @4 s! j5 S' I% g: X
  2. </div>; [2 l& V. ~, s

  3. : J3 [8 ~. M: X  l$ N0 L( ~2 q$ l
  4. <script>
    + A1 ]$ r" e+ {4 G) S9 g# z, ~0 I
  5. Vue.directive('runoob', {
    ! w# o! T6 t, b/ c4 k
  6.   bind: function (el, binding, vnode) {2 W* @$ _  G, g' ]
  7.     var s = JSON.stringify* h1 V# Q: b- _  {7 ^2 O1 U
  8.     el.innerHTML =" V# T# \" s: d2 H
  9.       'name: '       + s(binding.name) + '<br>' +0 c" n. Z' p1 F" ?9 f
  10.       'value: '      + s(binding.value) + '<br>' +& G7 [1 H3 Q% g
  11.       'expression: ' + s(binding.expression) + '<br>' +' [& e4 a. u5 _% s8 N. n, S) K
  12.       'argument: '   + s(binding.arg) + '<br>' +
    4 V$ R9 q4 _8 U5 r0 _% z
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +. l+ @# H- m  a, U8 x& X, L/ F! P
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')" v5 Q2 ?# |) N. q( k7 i3 K! J" `/ [
  15.   }) D, U4 E: w& \5 ?; h
  16. })7 q0 d; r! j$ k! L% {
  17. new Vue({
    + Z! N; x9 _) h1 {" e
  18.   el: '#app',
    5 x" X5 q0 f/ }, ?
  19.   data: {9 l6 K* n8 U" D- P
  20.     message: '菜鸟教程!'
    ( U* N) ^0 Y! B4 l1 \2 _- I) N
  21.   }  H4 H8 B$ G" R  x. r. a6 g
  22. })5 w/ a. \+ p0 S- t1 C
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:$ N- Z  z( r/ \1 }% K# L: R# c' u
  1. Vue.directive('runoob', function (el, binding) {$ s- S8 X. l2 X9 p* M
  2.   // 设置指令的背景颜色
    - G% ]9 X  }4 {$ v
  3.   el.style.backgroundColor = binding.value.color
    8 z1 L6 c  ^; Q' k
  4. })
复制代码
1 B1 [( D# P, Z) k6 c" J
$ `) D/ j; h- J1 H6 M
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例5 w$ i9 E# O% D/ R

' T  w! r, D* ?; P3 S, z' Q6 V
  1. <div id="app">' T- R( ~2 v* U$ h
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>" d# B5 f) R- v" g: Q2 [: v- j
  3. </div>- D8 r; v: D5 S

  4. 6 v& \+ U/ Z; R6 D4 q
  5. <script>" ?8 |# o$ V  L: |, S2 e
  6. Vue.directive('runoob', function (el, binding) {
    7 w* K' D: m) \( E5 u
  7.     // 简写方式设置文本及背景颜色
    8 Z) a8 f% A# g; R
  8.     el.innerHTML = binding.value.text
    " l! k$ j9 Z  @7 P9 b! n( X1 k
  9.     el.style.backgroundColor = binding.value.color
    ! `& q) x! u( T) b
  10. })& N' Y/ r5 t/ B( _7 V
  11. new Vue({8 h6 H$ l  }8 u; A( i! x' r
  12.   el: '#app'
    2 }* B. S$ |& y6 T
  13. })& a4 W; e$ q$ `2 @& `3 y: b/ ~
  14. </script>
复制代码
: p( g- I  x" |1 a; \3 i  ^

' v& \- g" I# J$ r+ U" H# k% l6 w" k' Q6 K% w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-11-1 11:37 , Processed in 0.128102 second(s), 21 queries .

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