cncml手绘网

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

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

) S6 O0 }2 M, H5 m0 B: c
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例; q* Z  V3 j+ V% {  Z1 a( j

0 D1 \1 I1 R4 i( P0 g
  1. <div id="app">
    . n' o. p5 D3 L) |9 ], w4 i
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    . V; P: v8 c7 K! Y6 L: G( R
  3.     <input v-focus>) _& u/ `2 a2 ]5 o7 z; J% \4 c
  4. </div>
    8 I9 F8 U+ J. B5 y' q9 U8 D( V
  5. $ T  x+ c) I0 t
  6. <script>" M( Z. _3 a: w2 e
  7. // 注册一个全局自定义指令 v-focus# }2 O: U' k9 A1 h
  8. Vue.directive('focus', {
    $ ~3 u: }2 c0 q* G
  9.   // 当绑定元素插入到 DOM 中。
    # |. x: j/ D* r8 H0 Q% G9 ^
  10.   inserted: function (el) {% o" |" D" w/ v# S. _! S& g
  11.     // 聚焦元素8 n5 `1 ?3 a. N6 G  n) N6 m# B
  12.     el.focus()
    0 \+ |* k) s0 Y! E5 Q! ^7 J
  13.   }: W$ I4 R" E3 u8 q* K- f
  14. })# u% I! }& @+ j( K4 g, n( q
  15. // 创建根实例& {* v+ w% b2 Z7 I
  16. new Vue({
    : f7 y3 @1 H3 d
  17.   el: '#app'
    . Q4 o( q$ N7 g5 V; Y/ ]
  18. })
    7 e3 @7 l& N! \* U
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例& d9 f5 P& `  b! }6 e

# Y5 Y! E/ a  F/ C9 {: q* O% F' z
  1. <div id="app">- t; f" O- E' D. B! `
  2.   <p>页面载入时,input 元素自动获取焦点:</p>3 m# N9 \. B# M3 y7 A
  3.   <input v-focus>
    % ^5 V# h5 R* ]
  4. </div>, F( c1 J- J, U. a

  5. 3 Y# h1 Q7 b4 f& i0 J* R4 n6 b
  6. <script>
    - K+ x& o7 t/ _/ B$ k- ?
  7. // 创建根实例
    - z3 f" `6 f9 c& Z, ]0 h
  8. new Vue({
    $ W5 t: l- ]& k; T
  9.   el: '#app',, K1 z8 F6 ]' r$ |& v  V  |$ b
  10.   directives: {
    $ _  Y! Q7 f' Q
  11.     // 注册一个局部的自定义指令 v-focus" r# s/ z9 V' j  U2 Z
  12.     focus: {4 p2 X# ^3 B% Y% ]2 H, y& V; {1 ~
  13.       // 指令的定义+ j& i$ |, ~6 g# Z) A1 x
  14.       inserted: function (el) {" M+ K+ @( _' K% A3 {# `
  15.         // 聚焦元素) e5 I, w- g: |) m
  16.         el.focus()( \. }$ x' V5 a' u# m2 i
  17.       }
    5 \4 `! B  I$ f, k, ?: `
  18.     }
    7 `  r2 `6 b; c+ T8 O4 W- `
  19.   }3 \" i1 w8 k6 X7 i( R
  20. })
    # Q" c* \) F0 e; \& \
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
钩子函数参数
钩子函数的参数有:
以下实例演示了这些参数的使用:
实例
( H7 H0 ^' G8 @+ v; W) B7 ~- C5 k- M* o, b5 g# k3 ?: Q7 x$ r2 s
  1. <div id="app"  v-runoob:hello.a.b="message">
    " M4 R2 ]4 F, Y: ], e" A; Z
  2. </div>8 d- c; Q) Y1 D) N
  3. # j0 q! S3 \, ?# r2 M$ U9 b
  4. <script>
    - R" K( {  }# ]3 D
  5. Vue.directive('runoob', {
    0 t. w' Z- D2 O* j# m) ~# E
  6.   bind: function (el, binding, vnode) {4 F. x! G3 c' ^5 K$ h
  7.     var s = JSON.stringify
    3 P% X- C' ^1 [" ?
  8.     el.innerHTML =
    * i0 _) G6 D, q5 T
  9.       'name: '       + s(binding.name) + '<br>' +# M- `; b2 _2 X* ?  l3 `2 k; B
  10.       'value: '      + s(binding.value) + '<br>' +
    2 D, ?) ~6 I* l
  11.       'expression: ' + s(binding.expression) + '<br>' +. ?5 t+ a# x7 h& P
  12.       'argument: '   + s(binding.arg) + '<br>' +
    - J; T8 B7 E" V9 d
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +! j7 `+ i* W! |* g% M/ j/ q, d
  14.       'vnode keys: ' + Object.keys(vnode).join(', '), {$ _# V0 e% x  z
  15.   }
    1 K$ ~- o7 L$ ]! r/ o
  16. })! d" H* z. A* }
  17. new Vue({
    % C, }. G5 T5 [
  18.   el: '#app',
      u. R1 S/ a3 l% Q' M  _
  19.   data: {# H$ Z6 F  S; a- m9 p) L. K( _3 G- H/ q+ q
  20.     message: '菜鸟教程!'* s' Z3 h* ?8 w& a  s
  21.   }
    1 L. O. G5 R. Z$ C' H2 T
  22. })0 O" V+ ?0 P( D$ I  d3 g
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
: x9 `. |4 T* Q. ^( c
  1. Vue.directive('runoob', function (el, binding) {; Z1 e! k, `& l
  2.   // 设置指令的背景颜色/ }1 z/ l" p& \8 Z4 I% P
  3.   el.style.backgroundColor = binding.value.color
    $ d2 @$ r9 J2 w4 x- a
  4. })
复制代码
3 O- O( y5 F5 [7 l7 Z

6 f$ i" d" q7 `" |. O+ V1 Q, {( e
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例, W! ]% D3 [  w/ {, z8 P
/ h+ a1 a" Y4 c$ _1 }+ T4 J
  1. <div id="app">
    - W. g; c  ^) p! c, R) s# A8 L7 @
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    1 ?, o# _- h. f! A" N
  3. </div>
    6 R* e2 Z' j4 k! |. q" O: n: N

  4. ! L9 O1 G4 s; ^  _
  5. <script>
    2 G( K$ \" l+ w# A7 U, C
  6. Vue.directive('runoob', function (el, binding) {+ \8 n% Y" i( ^# k1 q/ z% g
  7.     // 简写方式设置文本及背景颜色
    ) o- z3 H, r2 k. x  |3 D. ~( V
  8.     el.innerHTML = binding.value.text3 V1 W6 X/ w3 O! a' \8 u
  9.     el.style.backgroundColor = binding.value.color
    $ S7 f$ X  l: d
  10. })3 L8 X7 {( o$ k) e2 a* k
  11. new Vue({
    + C/ `1 {! n. e
  12.   el: '#app'- x: ?/ e7 k% n5 _" ]! }
  13. })% t6 \. ^2 K7 L# {
  14. </script>
复制代码
* Y$ Y. {% J! R* ^
5 A* ?2 A5 I) u) H. g
% y, ~8 R* a9 H% \5 y4 e' W





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