cncml手绘网

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

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

( C! V' r3 J7 r: l& I  ?
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例) g3 R! G5 t5 m9 S1 |

3 S- c5 @; \, o8 v0 X4 U1 m" n4 D
  1. <div id="app">. K5 b6 J+ p; D5 J2 C1 I
  2.     <p>页面载入时,input 元素自动获取焦点:</p>7 v0 M1 k+ [& Q
  3.     <input v-focus>
    $ b# m0 O  T- m9 w7 M* \* E2 t( B
  4. </div>
    & t- b  ?# X7 y4 c- c5 ^6 q9 ?
  5. & {1 _  J, ~0 H
  6. <script>
    + h& \" z5 z$ _/ k" g+ q( }
  7. // 注册一个全局自定义指令 v-focus0 t, w: `2 R% G* H9 X
  8. Vue.directive('focus', {% v' j5 v' n4 @2 G" Y
  9.   // 当绑定元素插入到 DOM 中。" R7 X2 C5 r2 g. l! Y8 l: I2 x5 i
  10.   inserted: function (el) {
    & K/ J3 p! Y5 Z; w
  11.     // 聚焦元素
    * u9 B) v7 g; q! {# I, }6 Z' j) B
  12.     el.focus()! |; t9 k6 v" Q& u6 H4 _: p
  13.   }; h9 J, P5 x) F+ p
  14. })( t3 t2 c2 f# q5 M8 R: i) s' E# t
  15. // 创建根实例0 g/ c2 i5 Q) f( `1 h% J* J8 E+ t
  16. new Vue({/ F3 m0 G# R7 G  C
  17.   el: '#app'  G! U. c# d" P$ A# Y$ w
  18. })
    # {! m, C" K3 T0 j
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
; O% k. Z3 b3 a9 h/ d( r# y" A8 ~$ A, p5 g
  1. <div id="app">9 u  E+ m9 O. C# \$ [2 D6 R$ o
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    6 q' b' I8 {& H# q( u
  3.   <input v-focus>+ ]) N6 _0 Y& r5 h& l7 o; c
  4. </div>
    & j) a& y( C1 p

  5. 2 V  M) g7 u) y& ^2 M  l9 D7 ]
  6. <script>, E  a- ?- {  j% f! ]0 q& I
  7. // 创建根实例2 ?9 u4 Y& N, Y/ `& |+ C
  8. new Vue({
    , O# h7 m4 W; c% m, c
  9.   el: '#app',7 z0 A  w3 {0 d+ M, ]& u. C
  10.   directives: {& X9 z- b. ?% T4 V# q$ }
  11.     // 注册一个局部的自定义指令 v-focus2 l1 u' g8 ~! s2 I- }" G9 C8 R
  12.     focus: {+ i; a3 C* M; D9 D
  13.       // 指令的定义
    ! F! U, I5 i  \- V0 D: |1 B
  14.       inserted: function (el) {  I* k5 h9 k7 K
  15.         // 聚焦元素6 I0 k4 U' \* K
  16.         el.focus()1 j0 _3 a8 {+ v+ _
  17.       }
    6 l9 z+ E+ K7 S, a  c
  18.     }
    8 z9 [: T2 s8 S5 G% F( T$ ^
  19.   }
    % X" R4 b& e# ?. t' I; g: j
  20. })
    " o% g& f6 q1 j0 n. g7 z
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
钩子函数参数
钩子函数的参数有:
以下实例演示了这些参数的使用:
实例
" d  L* \; Z! d# S, U5 }: O; e) D) f" ]- ~
  1. <div id="app"  v-runoob:hello.a.b="message"># k. q( F- L  `
  2. </div>& k3 D' c* s# \  `& \" M
  3. * ^& u/ U- d1 Z
  4. <script>$ v1 ^7 W5 i6 o8 j$ ~  P
  5. Vue.directive('runoob', {! P9 h3 ~- k# \
  6.   bind: function (el, binding, vnode) {4 Z) |2 D" h; I+ S' T
  7.     var s = JSON.stringify; Y- p) Y3 s2 b+ N& l
  8.     el.innerHTML =
    5 U$ J9 z4 }2 |  Y, U3 Q) k* `
  9.       'name: '       + s(binding.name) + '<br>' +* q: h$ E6 {6 z1 V  E( C
  10.       'value: '      + s(binding.value) + '<br>' +) e. A2 L) f: J! |
  11.       'expression: ' + s(binding.expression) + '<br>' +9 ^* ?& r! ~# A: s; _# z
  12.       'argument: '   + s(binding.arg) + '<br>' +  V: d, k7 [5 f$ m
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +: i8 ^7 R$ _5 @" j
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    " N: Y/ Y( m4 q  C) C) V
  15.   }4 j7 A0 G) J* T2 u7 [3 x6 {+ h6 i
  16. })
    $ [* n3 A+ }1 b* V* V" e
  17. new Vue({
    % V' Q( Q4 Z5 f, x8 ?8 J
  18.   el: '#app',1 k! q) D1 Z/ P% r" C' L
  19.   data: {
    ! C3 s' M" O- h' t
  20.     message: '菜鸟教程!'
    3 w, c2 _- C% k( a3 a* [* C. Q$ J
  21.   }1 R9 y7 _+ p: {) ^: l$ `
  22. })
    + u, B; k& g% F9 h& U& T5 a
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
+ O1 w! Q( k/ G6 [$ G8 o
  1. Vue.directive('runoob', function (el, binding) {# O9 y& h3 d6 f9 H! p. x; l
  2.   // 设置指令的背景颜色
    & g/ h8 k, R0 I
  3.   el.style.backgroundColor = binding.value.color
    1 ?9 |, C! e4 p% Y* }3 a
  4. })
复制代码

- q# o, C3 u' W
" q5 i9 [% u  c( r) K
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例. _/ ]' b# k, }9 p
' D0 S- C1 ^8 ~9 o9 }
  1. <div id="app">
    7 f6 }! k: J4 E* P  t/ Y' F
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    , K& e, `8 S- X% m1 O  [
  3. </div>: `) W0 A( f7 S* y' X! ~

  4. ; M9 y/ ]2 K6 A2 V: Z; x) w
  5. <script>
    ) Y- z0 N! {! \6 }3 y
  6. Vue.directive('runoob', function (el, binding) {$ Y7 k4 W, Z* z4 I" N* w
  7.     // 简写方式设置文本及背景颜色# W  w  @0 L" \1 a
  8.     el.innerHTML = binding.value.text  o: `* \& W3 h# C& B4 ~8 m1 O
  9.     el.style.backgroundColor = binding.value.color. M  I6 h4 ^6 {; X4 S6 S
  10. })
    : O( C* E2 C, r) \, A4 e: c
  11. new Vue({
    ( `2 Q, B0 m7 O/ k+ ?# h4 w
  12.   el: '#app'1 ]4 j' y- l; A6 `8 j* Z
  13. })
    2 J" O3 I$ A  w
  14. </script>
复制代码

) }- w, \& J5 _* k$ I6 |
" V" |- p" H9 {' R2 ^" g' H, O" ~" t* \0 i2 X





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