cncml手绘网

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

作者: admin    时间: 2018-7-4 11:36
标题: Vue.js 自定义指令
% a4 `' o' `6 q$ \/ q1 H
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
1 t9 x3 L  P" y2 x; {' V
$ [# v' a( r1 h3 Y4 b1 h% ~! t
  1. <div id="app">, D/ d, w( ^6 m' K8 a5 q( U  @
  2.     <p>页面载入时,input 元素自动获取焦点:</p>  V, ]$ ?6 ]" Q: w2 _) @6 E6 Q
  3.     <input v-focus>/ c  a6 `; p$ a9 i  e
  4. </div>
    4 a- T4 F- j5 V& a+ w
  5. . z9 s- s/ q0 ~. A( `$ k* M
  6. <script>. A; M" l  Y( ?' J2 G
  7. // 注册一个全局自定义指令 v-focus
    # {- m  ~3 D% m9 T' n' c8 T
  8. Vue.directive('focus', {3 K9 ~" c" U( h* }
  9.   // 当绑定元素插入到 DOM 中。. B% Z# m( M- h1 A
  10.   inserted: function (el) {
    . O2 r, J% |' p5 v
  11.     // 聚焦元素
    & v- Q( m  D  l" s. I9 |( P
  12.     el.focus()$ A* \3 c' d" a' i. s) ]% D
  13.   }
      l" p: I3 H% j2 h2 k  L, |% b3 t
  14. })& d& o( |+ d9 _( j( q# A
  15. // 创建根实例
    6 t" Y& r* Z& y; {% L1 @8 s( e) M
  16. new Vue({" a  O( a' x. o2 W% y: v4 M
  17.   el: '#app'
    9 c; [. ?) S' g  _, n1 w
  18. })/ E) ?3 k& @# U! e8 e; L
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
( n& k0 u, b/ ?. J1 y, x, {
/ F% f( s$ x  v
  1. <div id="app">7 B( a& @! F) [7 X
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
      ?3 y7 E7 M! P) v, H
  3.   <input v-focus>
    & F* N& C1 {( x6 a
  4. </div>" H  K! T' E. {% ]. B- C
  5. : x7 V9 W- D4 u6 s6 R' w3 c& e4 _
  6. <script>
    ! @! G$ ?  O. l
  7. // 创建根实例2 S5 b; E& Y  Y# o; l
  8. new Vue({
    3 J" G+ u( L1 F+ V( U
  9.   el: '#app',
    ' k4 i5 A4 q4 ~& b. d( E1 k- }
  10.   directives: {
    ! L/ U" v. ?3 q$ [" f
  11.     // 注册一个局部的自定义指令 v-focus
    8 u6 P) `% R" r) _& D
  12.     focus: {
    ( I2 L1 V  \% c
  13.       // 指令的定义
    ) w6 i6 y" Q- A( H  A  ]$ c; P
  14.       inserted: function (el) {
    , Z" Q, G. s- T  ~: U% F' c# t2 m
  15.         // 聚焦元素
    0 X) `4 G9 }/ b  g$ U
  16.         el.focus()
    " ]! ?" W; W5 H* H8 W  w9 g
  17.       }7 b* j( H1 B( k/ Y7 J
  18.     }7 C4 V+ s) s5 c' y
  19.   }
    - X: p% o& M8 ?  P4 K6 R
  20. })* ^; Q, T, a) P3 J8 d3 }
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
钩子函数参数
钩子函数的参数有:
以下实例演示了这些参数的使用:
实例' e+ ^% T* {; s8 j* v- N

3 j! q% T/ P4 h7 z6 Y& s
  1. <div id="app"  v-runoob:hello.a.b="message">
    5 ]9 D8 ]% _9 s$ P
  2. </div>, i. }4 ~" K8 O  b
  3. 3 f6 @' P1 @- B4 q4 W
  4. <script>! D% E* g! |5 C/ }- }/ q
  5. Vue.directive('runoob', {) c+ _  }  w/ S, Z- d2 V$ y
  6.   bind: function (el, binding, vnode) {$ R+ @7 q/ t$ _8 ^" |  H
  7.     var s = JSON.stringify. L) M  j" e5 g( z2 Z8 z; u
  8.     el.innerHTML =
    : {; B! d& U* b
  9.       'name: '       + s(binding.name) + '<br>' +6 X3 K( S3 K6 J- D1 G$ t$ d) B
  10.       'value: '      + s(binding.value) + '<br>' +% c- q" C: v: \2 g1 _! K
  11.       'expression: ' + s(binding.expression) + '<br>' +
    5 _; a& Y7 T8 L
  12.       'argument: '   + s(binding.arg) + '<br>' +0 E* v: K0 U2 v! e6 B
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +. [2 C' ?; m7 `: [1 c2 z
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')5 u% n% h& I/ w6 Z3 F2 @$ M
  15.   }1 b* W* [; R& R
  16. })
    / O! i, W3 b/ ?* n) \) R* g, }
  17. new Vue({! a- i, {  m9 L7 k* n9 t
  18.   el: '#app',
    3 l4 ^& [4 ]8 W
  19.   data: {
    4 j/ Q+ X, d: d5 t) C9 P* r
  20.     message: '菜鸟教程!'5 i: D! ^& U' |5 t
  21.   }1 E& H5 x( U0 }* u  U( p* h
  22. })0 z0 |8 X9 y2 `* q( N
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
* `) k9 P. i% P$ X
  1. Vue.directive('runoob', function (el, binding) {, G0 K4 L) W7 e% k( a8 ^5 v+ r
  2.   // 设置指令的背景颜色& u& }. A6 ^" l% [3 R& _$ `
  3.   el.style.backgroundColor = binding.value.color
      [8 {( B# Z9 w) d* f: G
  4. })
复制代码
' ~9 o, P. @' t) q
& F3 O& E! J( k) n+ h+ W* M
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例3 `8 s3 z) n1 o1 w3 }% K
+ n% |$ `: u0 q$ b0 b5 i% x
  1. <div id="app">
    2 u0 d# P! u" j% }4 D( x( z
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    ) L7 b; ~5 n: e5 h( t
  3. </div>7 Q9 |7 D5 ~  W" H" K' P: D  C5 t

  4. * U4 L$ x# o' d7 L
  5. <script>; e  k( {% i/ \! `  Q
  6. Vue.directive('runoob', function (el, binding) {
    . w  t  T* T# ?* a6 R( ]
  7.     // 简写方式设置文本及背景颜色
    * `& {5 z3 j: O2 D' T1 @( @
  8.     el.innerHTML = binding.value.text! z6 ^# H  t% H9 M+ b( w
  9.     el.style.backgroundColor = binding.value.color
    - j, \$ n+ u& t" N
  10. })
    7 r8 Y" _3 Y; y) C0 U  p7 a& w
  11. new Vue({6 H1 Q  k7 m+ N& q7 {) ?
  12.   el: '#app'4 c1 a) u  A/ d6 I
  13. })
    2 [: Y+ t6 p5 b0 W* X$ `
  14. </script>
复制代码

* O4 v  Z4 p4 q  f: p! V4 N9 T) I5 W
8 Q7 n: f! H& n3 k. d





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