cncml手绘网

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

作者: admin    时间: 2018-7-4 11:36
标题: Vue.js 自定义指令
* ]3 l7 X  }5 q" e2 {( M* d8 A
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
" {/ |  p: D1 v3 K! `' k6 u) Z! {* b% @1 w
  1. <div id="app">0 t# U5 o- X! `/ j7 _5 X3 T
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    6 ^$ F& C, @3 W, E
  3.     <input v-focus>
    ! b. m/ X+ J0 i* o; X; T
  4. </div>
    5 B- e: Z  ]% C9 v0 i+ u8 a# g0 z
  5. 1 N, y  w. m! _( Q! y3 j0 Y8 i2 e  o
  6. <script>, g$ N# h# R& z' ^; r
  7. // 注册一个全局自定义指令 v-focus
      R' g9 y. I  g  d$ R
  8. Vue.directive('focus', {
    ) u2 O  y$ n3 J. W
  9.   // 当绑定元素插入到 DOM 中。) W, H/ L7 t- m
  10.   inserted: function (el) {4 p) S% B9 P" Q, b
  11.     // 聚焦元素% ]  T: A# m* M: F2 z
  12.     el.focus()
    8 W" u' k0 p. r  U
  13.   }! _( }+ D2 ^6 k
  14. })
    4 x' H7 d; ?& W% n( t
  15. // 创建根实例( T# P$ N3 N" @! K1 X0 }( U$ i
  16. new Vue({
    6 t8 E5 Z  b  e; N& H
  17.   el: '#app'/ s# g8 f7 F/ E
  18. })$ b* N% |' `+ _# p
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例& v! j) A5 O) x, h

% X  Q4 R' }4 ]* H8 C6 ]
  1. <div id="app">8 D' M& ?# w7 a# ^1 n; q0 {
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    2 \% o# Q7 G3 g- Y  {5 O/ J
  3.   <input v-focus>
    ) v# p( H: p! [
  4. </div>; e9 `( _- `' H, E6 L" l4 {, I. w
  5. . P) p4 G5 p; N9 T9 x
  6. <script>
    # _  X1 a5 t  n  R: S( _8 S9 B9 }  o
  7. // 创建根实例7 E9 S% x6 c8 ?$ k2 s2 N
  8. new Vue({
    * ]. L0 y! O- n
  9.   el: '#app',
    / d! ^6 j& S/ i
  10.   directives: {
    1 r9 o- [- r1 u: `) c- z' y
  11.     // 注册一个局部的自定义指令 v-focus
    + A% R0 i8 C- i8 \- {
  12.     focus: {6 F; t! O: e. I: V' i$ D$ t; C
  13.       // 指令的定义4 b" M7 o4 P- Z; D/ w0 {
  14.       inserted: function (el) {
    3 [  h" B+ \* [5 w1 ?% J% E
  15.         // 聚焦元素7 f. |9 S: E# I* C5 J7 p
  16.         el.focus()
    $ E, j: y8 E& f. l5 R
  17.       }
    ' j0 v7 g( `8 w# _! i5 W, v7 t
  18.     }
      a; }4 C6 x3 B& P6 r
  19.   }
    ; S4 A# y  ^& R. G! t  y
  20. })
    1 z# B! m& l# H8 A" p: J
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
钩子函数参数
钩子函数的参数有:
以下实例演示了这些参数的使用:
实例* P% J* h$ L+ q9 h; f
8 U0 h6 M, i2 J6 E/ X4 L& v/ d; V
  1. <div id="app"  v-runoob:hello.a.b="message">2 D' v. S, ~* s* o: U% X" u# L9 U3 g
  2. </div>
    & D, }5 l4 `; c+ d3 d5 \3 t0 i
  3. 2 l+ G* a1 o- Y# n
  4. <script>
    # f, n  _1 A1 |+ i9 s: h( x
  5. Vue.directive('runoob', {  m) l+ Q( M2 q2 ]
  6.   bind: function (el, binding, vnode) {1 a8 }( w. ~% h; d. ]9 O
  7.     var s = JSON.stringify$ w* T( Q% @  [. R
  8.     el.innerHTML =) R% w& r5 r' J
  9.       'name: '       + s(binding.name) + '<br>' +
    2 F9 w8 z0 t. |( j
  10.       'value: '      + s(binding.value) + '<br>' +
    0 y8 T. Q2 {+ ?0 F0 l
  11.       'expression: ' + s(binding.expression) + '<br>' +
    / f! i( c) |3 @% ]! B
  12.       'argument: '   + s(binding.arg) + '<br>' +" k* X% I; k6 t0 K' g
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +7 w  s! F( s* w8 Q) X9 G
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')& e% I) s+ i- ^/ F$ X8 Z: N
  15.   }
    8 w' T. O# a/ d7 ]' a
  16. }). j% i. Z( J+ h& p) ?
  17. new Vue({
    . s4 V4 n, X) `& w
  18.   el: '#app',
    2 C8 f8 r9 r8 w# W
  19.   data: {
    1 ?* z7 V/ f. l( I2 |& B
  20.     message: '菜鸟教程!') N6 L" d  {$ X4 n  J
  21.   }
    ( H* _4 B' A5 b5 ~& N$ \- d1 R
  22. })2 F3 x8 z$ O$ E7 |- u; W- n
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:- J. r* {# a8 @
  1. Vue.directive('runoob', function (el, binding) {
    3 o+ b: Q$ y5 S" s
  2.   // 设置指令的背景颜色
    1 E, v. w+ q, n; y8 F' j. M% c
  3.   el.style.backgroundColor = binding.value.color% o: @2 c% D3 _) z
  4. })
复制代码
; W* C; y- @1 Y
5 f9 @# J2 }: J: T3 C! H" I! }
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
  w, S. J$ A" A- {2 i4 s6 l  _1 ~( ?6 A" r$ a
  1. <div id="app">/ C0 m9 @2 f/ g" R( ^! T% Q0 l
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>& e  y# M% u+ P) j: Y
  3. </div>7 c; Z$ ?  B" o

  4. 9 @, |' g! K0 i$ r5 V5 R* [4 `$ e
  5. <script># O( q3 m$ a# m6 J  E$ |, b
  6. Vue.directive('runoob', function (el, binding) {3 n  `2 O2 f/ I, q
  7.     // 简写方式设置文本及背景颜色
    * @1 u' H* M2 U( I/ p
  8.     el.innerHTML = binding.value.text  Q$ c: [, r$ w& V0 L4 u" e
  9.     el.style.backgroundColor = binding.value.color3 T1 f8 n! q8 x9 B0 q& C1 ?
  10. })& D, q6 [4 F( e$ ~, @
  11. new Vue({3 ~* b$ H! n: i7 d9 X  |) D( ~
  12.   el: '#app'" k  M- z. V: k: g- ^3 M
  13. })3 q8 Z8 F" z+ J, A, z
  14. </script>
复制代码
3 O+ m0 N/ d" K3 W1 ?" g* D& @

+ }  U( T  [4 N
2 B0 G2 g' v1 x




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