cncml手绘网

标题: Vue.js 自定义指令 [打印本页]

作者: admin    时间: 2018-7-4 11:36
标题: Vue.js 自定义指令
. m. _5 j- S3 d5 i6 C
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
$ E8 @; X, u, D3 |. V2 a
6 R* O/ M' ?1 _: J7 v1 D* y
  1. <div id="app">  X, J: \! }) y  J% u7 P" d0 k
  2.     <p>页面载入时,input 元素自动获取焦点:</p>: l* h& d5 s; H) C! E
  3.     <input v-focus>
    # ?( }& C+ A8 C8 t' q1 [
  4. </div>
    ' V3 j& {: [7 ~8 B6 J

  5. 3 C* O% p- r* a& h, f4 l6 j- S
  6. <script>
      o/ T: W( B1 z) c
  7. // 注册一个全局自定义指令 v-focus
    0 c5 a5 J0 J& Y& `+ _- Z
  8. Vue.directive('focus', {* @7 K: J  U  O8 ?9 k
  9.   // 当绑定元素插入到 DOM 中。
    - @5 B. |  v( e% Y6 K
  10.   inserted: function (el) {) G" R; k" i4 F  d2 |. K" _
  11.     // 聚焦元素
      N5 c' g* T3 g/ S
  12.     el.focus()
    ) M& c* Y! I6 O2 K* N: b
  13.   }0 d* k/ U& r+ f7 V, J
  14. }); K; T3 Y, V, }8 ^' q1 Z% m; \( g
  15. // 创建根实例
    , x8 K* A4 t( k4 g( F2 \. ]# o
  16. new Vue({1 }( ]( z  r# G& Q4 n
  17.   el: '#app'# h$ |  p! \; l) Y9 g, A( `/ H
  18. })
    1 q- H1 Q- B4 A4 M2 T5 q
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
8 w5 f0 D  ~7 H+ S! ?9 d& y+ v! E. E( p/ v$ }, |; w" w( i3 i
  1. <div id="app">: S  z2 b# {: d! [" H: T% u
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    * O' h! S% Q& \: e
  3.   <input v-focus>
    " u, ]  @+ N9 L' W  ]* H$ b
  4. </div>
    5 B( B/ X$ d8 ~# a
  5. 9 F1 F4 D  C) _* R9 N4 W8 \
  6. <script>
    / R- {( h) W4 m& I0 p; n/ v
  7. // 创建根实例
    ; n4 J' D$ E0 m- H. z7 z0 T
  8. new Vue({
    & r% i7 ~( a7 C8 c! H# H1 K
  9.   el: '#app',
    $ c' u' X" m8 }6 V/ ?1 d4 G
  10.   directives: {# x9 n4 x# O4 A& y1 H
  11.     // 注册一个局部的自定义指令 v-focus3 D* G, m2 s- f. X' T* {
  12.     focus: {( N  {* H8 _& M0 A: A9 C
  13.       // 指令的定义% h6 d  r0 b7 S! `4 A
  14.       inserted: function (el) {1 n* Q* a; c7 O
  15.         // 聚焦元素
    9 N( A' o/ a2 M+ }/ n7 A
  16.         el.focus()
    ! k$ C  e7 l; f  Y* \
  17.       }
    " A2 k4 s3 \3 X3 k- c
  18.     }& U3 t6 a& J5 Y9 h; K3 e/ K. B' m
  19.   }
    . f4 w" |8 U6 {. A( Z3 i* Z
  20. })
    + g5 ?0 P8 H& C; O$ V8 t3 J
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
钩子函数参数
钩子函数的参数有:
以下实例演示了这些参数的使用:
实例
8 m7 w% H" G8 I7 S/ F/ T
# @8 a: ?) k! K0 o
  1. <div id="app"  v-runoob:hello.a.b="message">3 b" `7 w: m  m2 N/ i! l& |
  2. </div>
    ' N% b" {# x( i$ @
  3. / b5 f" Z2 V8 z/ S# u& ^
  4. <script>
    8 Z( P2 F/ _2 P; P4 H
  5. Vue.directive('runoob', {: Z6 H9 r+ H! d6 I8 t
  6.   bind: function (el, binding, vnode) {
    , Q" @, q! ]- }
  7.     var s = JSON.stringify; Q% J1 X1 o  `: }7 U
  8.     el.innerHTML =
    ; {0 ]- y! w: [
  9.       'name: '       + s(binding.name) + '<br>' +
    # o1 @3 L, n) f5 z" O: W' O
  10.       'value: '      + s(binding.value) + '<br>' +% `2 J3 ]- q( L; I) b0 N
  11.       'expression: ' + s(binding.expression) + '<br>' +
    $ r! m. @. r) G5 l" m9 F$ z
  12.       'argument: '   + s(binding.arg) + '<br>' +
    4 P3 B, Y; W+ X: D  }
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    0 |4 c: q% d2 d9 ]
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')  L9 r2 H5 [3 F9 x4 P: L
  15.   }, w9 v; E; b: f! e5 c
  16. })
    " {) h* Y# i4 H
  17. new Vue({
    + p3 J( V- i" E7 `  u
  18.   el: '#app',
    $ c( P! i, z  I1 Z
  19.   data: {
    0 x) U- F! r5 f
  20.     message: '菜鸟教程!'
    7 j& Q  S3 m3 s! x7 U1 a8 G
  21.   }
    ( C4 b3 c& V% f$ M$ p( S, N) q# Z
  22. })
    4 G; Q! Y% w1 ~1 j
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:$ d; X6 W  _' l1 v2 W& D3 }. e. u
  1. Vue.directive('runoob', function (el, binding) {0 h) C  s, I/ o, _6 }3 ?. _
  2.   // 设置指令的背景颜色' N+ i1 i6 J7 n2 F3 u2 g6 C
  3.   el.style.backgroundColor = binding.value.color. S( Q& E/ x% P
  4. })
复制代码

# x7 G" }8 x: z- O) P& F, B: l' H/ b
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
. v4 h  I4 z. n$ J3 B- s, D- w3 w* m. A
  1. <div id="app">/ \9 S* b: L8 A" i: C
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    & f& l9 O" [$ M2 Z8 g/ m
  3. </div>7 ]! y1 i5 C5 V1 X! z5 V# \, i4 W4 e

  4. 2 E+ U$ B2 I- ]4 d. o/ z
  5. <script>
    : m; i0 Z. \* d+ o! n
  6. Vue.directive('runoob', function (el, binding) {
    / ]; m1 v7 g1 B- H3 G
  7.     // 简写方式设置文本及背景颜色7 s; @8 @" @8 s% v
  8.     el.innerHTML = binding.value.text
    6 ?/ _& T  C$ M9 d# t! e, L/ n( a* F
  9.     el.style.backgroundColor = binding.value.color' @2 O- m9 N: f1 y( I; ^: O1 `% B7 c
  10. }). E- |! ]; t  D$ ~/ ~8 z/ g7 J; ?
  11. new Vue({0 i7 `% r- B7 y& P8 N
  12.   el: '#app'
    2 V: P: ]( [9 q4 F
  13. })& o0 K* d; n, B  p  Q
  14. </script>
复制代码
; A" ]) N, \" ^1 H" ]  k

( L# t  }8 n4 P, {' V, U! G, ^: \
2 h7 x& s/ G( k




欢迎光临 cncml手绘网 (http://bbs.cncml.com/) Powered by Discuz! X3.2