cncml手绘网

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

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

# r2 @5 c' q3 A% a
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
6 \8 ~# `3 u+ C" ~$ f, m
# z. Q4 [0 r% `; Q
  1. <div id="app">
    - M: }/ f# {# c" s0 g7 l4 i7 v! E
  2.     <p>页面载入时,input 元素自动获取焦点:</p>& y" H- }0 r8 u
  3.     <input v-focus>! p% A" H0 Y9 Y$ e0 |$ Z5 Z+ }
  4. </div>* ?- A! H0 ~8 C# I

  5. - q5 n: \) S% Q8 b9 e
  6. <script>
    0 ]  [0 m! G; `2 p
  7. // 注册一个全局自定义指令 v-focus2 y2 Z* ^0 m: o; X7 S2 _' u
  8. Vue.directive('focus', {2 @! |' P$ K! C5 ]" s
  9.   // 当绑定元素插入到 DOM 中。
    0 L6 C3 S' B+ _/ B' l. \1 y
  10.   inserted: function (el) {6 X$ }6 `+ h6 G4 ]/ q5 p, ?! V0 _9 r
  11.     // 聚焦元素) m0 y. t3 [4 h, M* z% _; k7 m+ \0 S7 }
  12.     el.focus()
    7 Z, E5 l; M9 s* P" K1 F
  13.   }0 c2 D6 N, {& X8 \0 \$ @
  14. })
    ( M: e: f1 U' y" L) _$ d/ @( l
  15. // 创建根实例' w' j, t+ v& [( _2 y# N  g
  16. new Vue({
    ) {8 R9 ?! {1 V  y. S* }
  17.   el: '#app'4 r9 Y, \2 C, o: a: F; ^
  18. })5 o# I7 j! i/ }' G
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例% J7 }' w* V5 o6 D- e6 b) p2 B
2 Y. \# L1 N  \/ }
  1. <div id="app">: t; M: q- P% a3 p
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    5 `+ T$ r6 L: |6 |) g- F# d/ D6 |
  3.   <input v-focus>
      Q" I9 U! x' u: Q& g1 y. C% v* N9 ?: \
  4. </div>1 g1 j+ r: s! l! i: P: x) G+ T; c4 y" a

  5. % |* |2 ?, ~! U- g, i
  6. <script>, Z$ C3 P" j  e' ?' X
  7. // 创建根实例
    0 q4 Q! x3 G/ ]2 ], V( H% z9 U& u( M) x
  8. new Vue({
    2 B% g/ e$ S$ y$ q5 ^4 t8 _6 [
  9.   el: '#app',9 f6 p: j, m$ Y# q8 `/ ?2 _
  10.   directives: {2 j3 i$ m  w8 V$ D  A9 f
  11.     // 注册一个局部的自定义指令 v-focus3 Q/ X0 Y. ^3 G( n. b3 X& K& a
  12.     focus: {5 }- [' g- f5 G1 C2 b
  13.       // 指令的定义. D& B- ]- d6 q; ]3 k; |5 [
  14.       inserted: function (el) {
    ) I; J4 J4 n  M9 T) {; @) [0 H
  15.         // 聚焦元素; m! A; `: b: U) P# \
  16.         el.focus()5 j0 }' @8 ~) e3 k- S: i3 S$ S
  17.       }
    ; _0 `) R4 M, P
  18.     }1 g6 F  r( f; @; {7 i+ T' X- N" L
  19.   }/ L5 z' u/ n! X2 Z0 N, h
  20. })9 ?) c( T$ A+ d% }+ Q
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
钩子函数参数
钩子函数的参数有:
以下实例演示了这些参数的使用:
实例
" s" z8 k" m& A1 C! f6 h
5 Y) k: l! F* }! M" _
  1. <div id="app"  v-runoob:hello.a.b="message">8 {. |" K2 q! K! a1 d; {" A
  2. </div># }) t0 K) x3 M
  3. - v, L) m6 k7 d; W  ^. V( z: X
  4. <script>
    " t& z: d% d8 |/ U) A  R
  5. Vue.directive('runoob', {" U; v# g! |# j* x
  6.   bind: function (el, binding, vnode) {& J5 ], F2 b( `2 u& e
  7.     var s = JSON.stringify1 r, l  X! t$ X- s( _$ W; C
  8.     el.innerHTML =
    5 r- q6 ]2 \- T) p7 R$ J  P8 P
  9.       'name: '       + s(binding.name) + '<br>' +
    , r8 ?- c/ n" I# a) M) I
  10.       'value: '      + s(binding.value) + '<br>' +' b' N0 P6 v; T, h5 l
  11.       'expression: ' + s(binding.expression) + '<br>' +
    + W: a& `2 B& W) Q: v$ c  G' A
  12.       'argument: '   + s(binding.arg) + '<br>' +0 {7 j+ {( R+ F. f2 U2 k$ A# O
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    & E' ~4 v. K- H( s9 Q6 g
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    - A1 Y4 h$ l5 o6 Y6 E
  15.   }* P! E* d7 @) ~/ _
  16. })8 F1 N, i* D- }2 P9 d3 x
  17. new Vue({4 C+ X! H+ q1 d' y
  18.   el: '#app',, R7 N! ]* k+ ]* ?2 I
  19.   data: {
    ' B8 `! W2 S' k( C6 n4 \" F! E
  20.     message: '菜鸟教程!'2 a. T8 Y/ k: A! V
  21.   }- K( [  j8 @* j# }* j8 g8 r
  22. })8 h  _; A* W9 N" H' `7 g- S
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:4 V0 M$ u2 R$ G, w7 l$ v6 L4 X
  1. Vue.directive('runoob', function (el, binding) {1 }# a9 S+ Q# N* Z2 q
  2.   // 设置指令的背景颜色
    9 ~! X# h% u1 d' I9 X
  3.   el.style.backgroundColor = binding.value.color5 W7 b$ k; @- G0 t9 V
  4. })
复制代码
8 [7 l5 N8 @. }2 X9 X: K* O

! H$ D& _" W" A
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例# ^: l5 a0 t8 W" C

9 E* D8 o# C6 {, c! W( h6 a$ }
  1. <div id="app">
    & |& }# M) ?  K+ S
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>. L! A( m) d3 o9 P4 m; i+ A  X
  3. </div>4 N$ w! J8 Q7 ]2 O) E& R/ z- J
  4. , s! ^: ~6 ^0 {% i5 E
  5. <script>
    1 H- ]+ p1 h; T3 D9 w8 \
  6. Vue.directive('runoob', function (el, binding) {
    " i# K" `. z, B+ X5 W
  7.     // 简写方式设置文本及背景颜色
    , j4 x9 `+ E% |6 I
  8.     el.innerHTML = binding.value.text- Z5 h+ Q: o" e! K7 f+ D) u
  9.     el.style.backgroundColor = binding.value.color
    / K; l* Q+ t' l$ q8 z  ]4 ~1 A
  10. })
    # G4 L- v# j6 H: ~+ _. o: C
  11. new Vue({! |' y  D- r: h: f' W5 O3 G& e
  12.   el: '#app'
    + w1 u5 M& X0 V' q$ t; P" X
  13. })
    ; x; ^2 ?$ X/ k3 T; ^' s
  14. </script>
复制代码

7 Z% p" G( S" ^) e8 K& v( M* ~3 J, z1 Z
, S; ?, O; I* x$ [$ d





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