cncml手绘网

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

作者: admin    时间: 2018-7-4 11:36
标题: Vue.js 自定义指令

  H, m& Z% B" y8 a: Q0 |. ~% G
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例" d0 u, F9 K; e/ m
% D# d5 m. ], s$ q7 E8 R
  1. <div id="app">
    / K* [0 q$ @/ ?
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    ) f. K( I2 A$ z' l
  3.     <input v-focus>
    2 O% w8 O( ^  q8 N
  4. </div>, r& ^& C, x  v
  5. : D  ^" Y( m$ u* c$ l
  6. <script>5 g7 L# _7 o$ f) q- X& e
  7. // 注册一个全局自定义指令 v-focus0 M( N, I3 X% Z: X9 S  G
  8. Vue.directive('focus', {
    ; _. s/ J! T* J* J. x" e
  9.   // 当绑定元素插入到 DOM 中。+ M3 S3 c$ G1 S0 U
  10.   inserted: function (el) {: `& U5 S, C; M' I9 k: C/ [( r
  11.     // 聚焦元素
    * J9 r" T4 \& J7 U* {9 |
  12.     el.focus()! `9 Q$ a+ T5 ]0 [9 v% S2 _
  13.   }. {! V* g8 H: L( S+ ?8 ~( Z& }
  14. })$ c/ s% M3 v# N& a
  15. // 创建根实例
    6 W; Q4 ?2 E" a* @8 G
  16. new Vue({
    8 E7 ?2 e6 v1 [0 |' U* v- C' `
  17.   el: '#app'
    5 @, a. y0 o9 `0 m" e, k% j. T
  18. })3 S) o, }- X) a3 _! A( h  ^
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
+ i* Q; w5 z, E
) Y  D# u; Y1 x% o
  1. <div id="app">( ^  ^7 x$ C7 O: l
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    $ i$ u/ V: B' |: E7 @, `1 S
  3.   <input v-focus>$ t4 x  q& u: z7 }
  4. </div>/ W( o% t  V% x7 E2 Q6 e) W. u: X
  5. 1 @+ z$ b0 A( R. P; L3 ~
  6. <script>
    8 Q! v8 \) V& f0 I' b. @1 m
  7. // 创建根实例* k' i+ L  o' F! D1 ?
  8. new Vue({
      A& G) I# l. I! C
  9.   el: '#app',3 R( S+ z3 \$ v1 v( n, t) W
  10.   directives: {1 t2 n+ [  r- S9 h
  11.     // 注册一个局部的自定义指令 v-focus
    9 ^; V8 C- W/ n9 V. S+ h- _
  12.     focus: {5 m5 j% v$ _% t& L# M! L# A, W
  13.       // 指令的定义
    % Q( a' `# ~, y# V8 v
  14.       inserted: function (el) {% Y! _1 ~) d2 r5 f$ P& v
  15.         // 聚焦元素
    ' b2 N6 N1 a: D$ p' \
  16.         el.focus()
    ! `- e4 f; _, ~: w
  17.       }( N1 @* l1 X1 d4 `5 r6 `3 Z* H
  18.     }
    1 `" w2 b" b* ^. r1 t
  19.   }
    0 i4 Z- E( S3 s6 N: c1 y
  20. })  m3 Q$ ?7 e' \3 ^
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
钩子函数参数
钩子函数的参数有:
以下实例演示了这些参数的使用:
实例
6 y* }  x( Z8 |( k0 i/ b( N/ `% O$ B+ n" O0 z, V/ O0 D
  1. <div id="app"  v-runoob:hello.a.b="message">
    + C( Z; J; f: Z1 x) f
  2. </div>0 N% y8 A# V: P8 F7 h7 q
  3. # u8 @- y( n4 [4 l( B* E
  4. <script>
    ; b7 r; ?( s# Z1 |0 z5 k7 I: s
  5. Vue.directive('runoob', {
    5 Y" T8 K6 t: I6 S) A/ A
  6.   bind: function (el, binding, vnode) {
      q  K' p' t: c
  7.     var s = JSON.stringify
    2 c- w1 Y/ g4 }% {) ?
  8.     el.innerHTML =
    ' B: ]$ H( M3 p9 y
  9.       'name: '       + s(binding.name) + '<br>' +
    + h/ ~$ c3 g1 d$ B4 O6 l* g
  10.       'value: '      + s(binding.value) + '<br>' +
    . g( D6 y1 w% j1 J5 ]% K
  11.       'expression: ' + s(binding.expression) + '<br>' +% I, c7 Q" G+ U  @* \, F8 S
  12.       'argument: '   + s(binding.arg) + '<br>' +
    ) \6 O$ [- M! y0 e8 Z
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    2 b# @2 I: o8 X- k+ ]7 |/ Z  ]! n
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    ) W6 L% d$ O( y% [* H
  15.   }  h8 H+ i: O# d; G
  16. })
    " [" ^; m4 k/ @! M* u$ t* \
  17. new Vue({
    : K& J0 \5 H* L# Y1 w6 A
  18.   el: '#app',
    : o- Z5 z1 C: M; B1 j% m
  19.   data: {
    - y  Z2 y8 K% a
  20.     message: '菜鸟教程!'  L$ d6 [' u3 G. a
  21.   }
    . f6 V* D% o5 [7 G5 Y/ E
  22. })
    , i4 l5 z2 L4 g) k; [
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
4 _( z& M9 p2 p6 a5 x; S6 P/ A0 l0 X
  1. Vue.directive('runoob', function (el, binding) {& b) ^. L5 H2 b& u3 Y* P9 P$ E) z
  2.   // 设置指令的背景颜色3 N, X  P& G" d
  3.   el.style.backgroundColor = binding.value.color: @" f, w; ?7 U, }  l+ W% f' M4 ?9 L7 |
  4. })
复制代码
7 O( N2 u9 B; }$ C9 O

5 a; {6 ?5 q* ^1 a: {
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
1 b1 W- u8 C4 E1 p, y, a3 `- O: x! o$ _: h# e9 t
  1. <div id="app">0 l; E1 ?; F; C) p; {
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    9 U. s$ y6 t4 k5 q$ f2 B+ R
  3. </div>
    5 `5 |* q( w2 K' B$ B4 O3 M

  4. 4 C+ Z0 O8 U: G7 B6 C8 f
  5. <script>
    - H5 u' Y9 X7 V: q
  6. Vue.directive('runoob', function (el, binding) {! Z0 ^+ i) k( q) S7 z. w3 ?
  7.     // 简写方式设置文本及背景颜色
    : E. H9 X" Z; ]9 H% f8 s4 V
  8.     el.innerHTML = binding.value.text
    3 E% `% M1 K# b5 R3 M5 [
  9.     el.style.backgroundColor = binding.value.color
    ! ~9 E6 a2 @' w+ o/ @& _
  10. })" Y+ `5 K+ ]1 J" L& O  @3 a4 l4 H
  11. new Vue({
    ; \" Y: l4 ~+ R$ z* ?
  12.   el: '#app'
    ; ?2 p7 [+ j7 y6 I1 G4 E* L' h
  13. })) D/ q9 E6 V4 {
  14. </script>
复制代码
( N  F& j- j: Q4 Z; {* h

* E% X. ^; x+ d9 h' A
8 X6 e0 o% b' a" C




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