cncml手绘网

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

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

& z# d3 x, C  I1 h. U6 a; f1 }% s
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
& c. b7 f( |- u: _0 k
. L6 x. ?  G/ O% l
  1. <div id="app">/ n8 V; G( {& u- z" ]  u3 S% f6 E
  2.     <p>页面载入时,input 元素自动获取焦点:</p>' ?  m5 P2 w- b% x. V/ P
  3.     <input v-focus>
    6 ]! X* ]2 j' g; ~
  4. </div>* x* v* o7 k, Z4 R) r1 q
  5. ' l( N- z2 V+ n# s1 g
  6. <script>
    ) b+ ^% \4 E8 V- Y
  7. // 注册一个全局自定义指令 v-focus" E) B% r. z  ]+ l! V/ i! k4 Q# J
  8. Vue.directive('focus', {! w- r3 b7 c1 W( \
  9.   // 当绑定元素插入到 DOM 中。1 r) `" E' ^6 t' _  C
  10.   inserted: function (el) {4 p4 E# U5 j. T1 A8 ~' b( k
  11.     // 聚焦元素
    - G; Y3 d  T; g0 u, v7 L' G
  12.     el.focus()
    ( }* y4 y7 P8 @
  13.   }  D/ t! z* ?. u. i# I* N9 |$ o
  14. })
    9 z; ~1 o. D4 u; _
  15. // 创建根实例
    ( l( V3 J# _# K# O6 d
  16. new Vue({
    ; M; R  k  l* d' Q
  17.   el: '#app'
    1 T7 n9 E+ ~- G3 o" C4 q
  18. })
    7 L6 }1 O% M( R
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
- Y( d) U  Y/ J$ c0 _- y& {4 H, s7 Z. d4 E5 m: i% P. c9 h
  1. <div id="app">* v9 ~8 Y5 L* N4 O& W9 Q! u- h
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    6 l: _% s6 D% z  T0 k9 k1 V) K
  3.   <input v-focus>
    ! E$ t: q: K1 }. l7 y" G7 X# m
  4. </div>+ m& o6 z' G/ a1 F6 i

  5. 1 t: b# N5 P8 x3 E* Z( X: i& L
  6. <script>
    , s2 ?( O+ P7 y$ T
  7. // 创建根实例
    2 W2 J2 ~3 V' ^3 B6 d3 j9 g! \
  8. new Vue({
    ' i. m# a& i# u, }) F$ s
  9.   el: '#app',
      t+ t& s& c' Z1 J) D3 f
  10.   directives: {
    ! g! {' f3 V  B; V0 a8 X
  11.     // 注册一个局部的自定义指令 v-focus
    ' k- j6 R; v& O6 q# m( F2 J
  12.     focus: {7 r+ e: B4 [! s+ [4 `
  13.       // 指令的定义
    . p; b: J+ C8 W
  14.       inserted: function (el) {
    5 U, u& [6 u! b6 a5 x* F
  15.         // 聚焦元素
    1 @# ~& P3 O% ^" u
  16.         el.focus()% t) b! ?2 }1 I& ~; O  M% h
  17.       }1 p# v8 O# [$ j5 V* {
  18.     }* e8 z3 i$ U$ [
  19.   }( e; H9 q8 o9 A% t, w
  20. })& Q, n& `9 R, r: ]3 @% T
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
钩子函数参数
钩子函数的参数有:
以下实例演示了这些参数的使用:
实例
1 t! {) ^  r. B9 V8 x7 G* T% \' y4 G. N, `5 ~% i* k
  1. <div id="app"  v-runoob:hello.a.b="message">
      ~- ~9 _8 l$ S' z3 O$ I
  2. </div>2 u* O/ p3 X' k" q9 e) n# g+ x, F' v
  3. 3 A7 l6 Z* Z' R' e/ A
  4. <script>
    ; @2 |# y7 E# J/ |/ Q
  5. Vue.directive('runoob', {
    4 i( b% t7 c7 T6 Q2 k  t8 D% w& m
  6.   bind: function (el, binding, vnode) {
    ; `8 M  z3 o3 i7 b7 h  h+ c
  7.     var s = JSON.stringify
    / ?5 f$ ^' T, m+ c; i
  8.     el.innerHTML =
    ( T5 Q! n9 N1 G+ d: O. W
  9.       'name: '       + s(binding.name) + '<br>' +, X8 J7 P0 b- k6 i& R' T' Q
  10.       'value: '      + s(binding.value) + '<br>' +
    3 \; \/ X3 o4 G
  11.       'expression: ' + s(binding.expression) + '<br>' ++ S+ {2 t$ K5 h2 c  }5 `
  12.       'argument: '   + s(binding.arg) + '<br>' +
    - S- X  v& v; Q. e- d& [" |
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +# V! w) U. B* Z& _
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    7 I2 d: o7 y+ h( ?
  15.   }) l" E6 }: J, ~& i$ o/ ]
  16. })
    ) j9 u% `4 j4 Y, @# X
  17. new Vue({
    * V8 F3 [& u* V9 F
  18.   el: '#app',1 Y; b" H" U6 M* d
  19.   data: {# Y: H4 h# k7 c% b+ W7 {6 A
  20.     message: '菜鸟教程!'3 ~1 b4 T' c& @' M
  21.   }3 {# z/ |( t& j4 d
  22. })
    3 I  C4 t: }$ U* s! y0 b
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:6 l7 c' C; Z; l/ y* i' M
  1. Vue.directive('runoob', function (el, binding) {0 b( i. ^  V4 R+ I. c. w* _
  2.   // 设置指令的背景颜色
    8 Y; X" M. D/ w" U
  3.   el.style.backgroundColor = binding.value.color  ^0 w# y4 D  V! p+ a6 v) ?, E
  4. })
复制代码
# m! _3 c  b7 s0 U# l
1 z4 H& l! m- \! ~( M
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
. s7 V2 p9 v+ b2 ~5 ~$ f. \! A. g+ Z" o; E4 }! w3 ~% @& S
  1. <div id="app">6 {: i9 h0 x- X- N
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>3 P5 v: ]& q* @* |: a( Q
  3. </div>: Q  T1 C7 a: W0 _+ Q
  4. 6 I1 l8 F. x3 r+ x
  5. <script>
    7 P4 H& E2 Y' }' d3 v5 t  Z
  6. Vue.directive('runoob', function (el, binding) {# g: z2 ?2 N0 w
  7.     // 简写方式设置文本及背景颜色
    . m; V( N) O2 w% g
  8.     el.innerHTML = binding.value.text4 p2 T# m, Z& g- ]1 b' \
  9.     el.style.backgroundColor = binding.value.color
    % r3 Y( |! @2 X7 F0 p: R5 u
  10. })
    0 X) y; V9 X+ F8 b6 K3 K5 r( _
  11. new Vue({
    , p7 }; F6 F3 j; d! f+ Y% W
  12.   el: '#app'( v2 e& h; u' w% H
  13. })
    $ Y8 R5 g1 ^, Y$ |
  14. </script>
复制代码
7 h8 q5 Z  N  ~+ d' A
* n1 @7 L) d( J5 x! f1 g

" N& t) l+ s* l




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