cncml手绘网

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

作者: admin    时间: 2018-7-4 11:36
标题: Vue.js 自定义指令
  g( M$ u$ n4 Y# o
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
, [" e  D! w6 s1 ~- i* @% p
$ b* @+ F3 N* {, g4 @
  1. <div id="app">4 m3 X' i1 n7 ^
  2.     <p>页面载入时,input 元素自动获取焦点:</p>5 K8 Q: q7 _+ b' {6 a. }5 H
  3.     <input v-focus>
      ]* _0 E8 w2 G: d
  4. </div>
    / x! }- w( G0 ^9 m
  5. ( B" C: N: A6 U, m- m* t; N
  6. <script>8 I* \  Y" c  E& I# t2 |* A' s$ [! k
  7. // 注册一个全局自定义指令 v-focus
    9 a& @/ j6 v4 P0 G9 A
  8. Vue.directive('focus', {
    4 K: B0 f4 J1 ^9 F1 A4 W2 A
  9.   // 当绑定元素插入到 DOM 中。$ K+ e5 @1 W: V+ s! S8 u+ o
  10.   inserted: function (el) {9 O5 R8 Q5 x, z# I
  11.     // 聚焦元素1 Y# f) ~0 I* ~- f
  12.     el.focus(); v- H" d$ ^" h7 O1 a* F
  13.   }7 |/ B1 h6 v% p" k' r
  14. })9 E1 y- b3 t2 |2 Q+ G& g6 Y
  15. // 创建根实例
    & F6 Y9 @- h, C% A5 K
  16. new Vue({
    ; S+ ?7 s/ y8 l" B5 \; ~  r' ]/ i
  17.   el: '#app'
    % P. W9 M7 k) ?9 K& ], k' f6 q
  18. })6 }$ ^) o. F7 w( o
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
+ S3 c8 y! ]6 m/ [; X. F9 q& m: [6 y1 W5 R  S- q$ J$ ]) e" G" k& k
  1. <div id="app">2 {: u5 f3 y2 c
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    - c9 [5 E9 u  L
  3.   <input v-focus>2 f8 Q" Y: n- g" Y  j' i' |8 P- Y4 Y
  4. </div>% \3 _! p5 |: N1 L7 j+ w

  5. ; f, ~& s5 z& U  k( r
  6. <script>
    3 w( p) C- z$ t% r& I5 B4 p( o
  7. // 创建根实例: g! T+ Y0 t6 U. {' L% f# ?
  8. new Vue({
    ! d0 e- |) y9 j9 ?& z; v' ]
  9.   el: '#app',
    1 r* L) D: C' ^9 u$ w+ D5 K- I5 }
  10.   directives: {
    3 N1 ~* M3 h) i+ g
  11.     // 注册一个局部的自定义指令 v-focus! S  ^, {4 b+ j/ m8 Y
  12.     focus: {% L" T6 r0 o; M
  13.       // 指令的定义: ]9 D, n7 U9 N$ k; m! Y% u
  14.       inserted: function (el) {; d+ K0 }$ U+ S+ n
  15.         // 聚焦元素, `2 J. r; V  W0 [- w6 H
  16.         el.focus()
    % I$ D) t2 {0 `/ Y+ V% M7 a
  17.       }% x& d+ T# y1 t( m
  18.     }
    + L9 a4 ?: A$ _
  19.   }9 N  m6 T% ^7 n7 X
  20. })& q' U# u: ]5 {6 |+ g
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
钩子函数参数
钩子函数的参数有:
以下实例演示了这些参数的使用:
实例& |; o5 {( A8 V5 K

: [: u% I3 t* ?0 V
  1. <div id="app"  v-runoob:hello.a.b="message">
    / q* e1 D* B. I+ B- q, x' T+ b
  2. </div>
    : ?( u2 L( p4 {' K0 [

  3. 9 t( g' W1 O) p
  4. <script>
      k1 F. ?) [, q: [; z" O
  5. Vue.directive('runoob', {7 G$ s( p0 i2 ]5 B' Z7 K" e
  6.   bind: function (el, binding, vnode) {% G6 `  j) a6 I8 w/ f
  7.     var s = JSON.stringify* p" v1 W4 I/ Q: {6 v; ?" H: v  F/ j
  8.     el.innerHTML =6 H0 B' a/ z& l5 y0 s# P  b- D7 j6 K0 f
  9.       'name: '       + s(binding.name) + '<br>' +$ J$ `" {$ g  X8 }
  10.       'value: '      + s(binding.value) + '<br>' +
      `4 P* y& p6 _0 M5 x9 X( k  R8 U
  11.       'expression: ' + s(binding.expression) + '<br>' +
    . R  z, ?: a( P5 J
  12.       'argument: '   + s(binding.arg) + '<br>' +) n, y# k' D4 x5 a: z
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +* L9 T; P/ W' `' @0 l$ J, s
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    " [  t  z& u- }% G& T
  15.   }- E* @' H( t) b6 K7 d
  16. })
    ) n. j$ k9 z; h9 ]& s: O  e7 S* p! q7 L
  17. new Vue({; k6 l' t, V/ z+ l8 o$ G
  18.   el: '#app',- i3 ]9 o2 E0 M0 F
  19.   data: {1 m7 I; `) g7 k4 ?' u, B
  20.     message: '菜鸟教程!'
    5 f9 L: e7 m, {; g
  21.   }
    * C" }- q' {9 s1 h
  22. })0 s; F& |$ [: E3 Y
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:/ w$ ~# v; T, @: f0 Q7 a  l  `
  1. Vue.directive('runoob', function (el, binding) {8 f  A5 O, D, f1 ~
  2.   // 设置指令的背景颜色6 M. a; t3 r' E/ j+ {
  3.   el.style.backgroundColor = binding.value.color
    0 k4 c, X# x1 g3 B# ?; y
  4. })
复制代码

1 |* D3 X( X( v( m2 c+ b8 W4 r" ~( k5 t
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例9 y/ @) C9 c) g( `: `$ I) |

! o9 N. D8 d8 Y) z
  1. <div id="app">
    3 j5 r+ e  f7 t9 G. O
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>  b4 I5 v( z: e( f5 `) b1 D
  3. </div>3 p- S) _  `1 ^) ~2 T! D1 g0 b
  4. " g  \$ n0 [; w$ p6 l: `3 J$ `% s  Y3 L
  5. <script>
      m& ~; O7 v# b9 L
  6. Vue.directive('runoob', function (el, binding) {, D9 }/ ]; w( D4 B9 n( A
  7.     // 简写方式设置文本及背景颜色: T  \  \: v1 |0 n$ s
  8.     el.innerHTML = binding.value.text
    " J, I; ~$ L4 p# }% U, Z
  9.     el.style.backgroundColor = binding.value.color) p- I: j# N( G! {: N  ~- C0 \8 u
  10. })8 z4 R- n; H8 R0 W! w
  11. new Vue({
    # z) N9 b& t, \9 x7 R
  12.   el: '#app'
    # R( D( ?* s: S9 y+ j+ D* P& O
  13. })
    2 r3 l( A& w+ B/ j
  14. </script>
复制代码
: d- v% B6 y, x! a
' N* f: o7 Y% m+ v! C. [

1 j0 {/ S' E1 P3 s. T7 K




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