cncml手绘网

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

作者: admin    时间: 2018-7-4 11:36
标题: Vue.js 自定义指令
; v. T9 C' ~( M* @' d% v
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例# B$ O; ?0 ]1 f5 z: J: m

8 q+ `8 I& K7 J0 `9 c% Z# H
  1. <div id="app">, o7 ^5 A  q+ Z9 P7 ^+ D
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    * N& Z) g6 b( e* `, M
  3.     <input v-focus>( L3 N* t" S" T; E
  4. </div>
    % g4 `: u9 T: ^; w) {7 C

  5. & o, j& ]( c, G( M2 d! _
  6. <script>
    / U; i' G7 E3 L
  7. // 注册一个全局自定义指令 v-focus
    & f( d* {% Q$ h$ G8 I
  8. Vue.directive('focus', {
    ) A4 y2 H, h$ M$ V0 D1 U
  9.   // 当绑定元素插入到 DOM 中。: N% E, b" r3 V3 w
  10.   inserted: function (el) {
    2 [; ^( u* }- C; x' M* X6 O
  11.     // 聚焦元素6 [8 w" r1 h. X- u5 L
  12.     el.focus()
    6 e* `+ L0 h9 c, A' G7 s
  13.   }5 M4 i3 T' k4 e/ s% y' D6 P, ]
  14. })
    % X1 I; l( X' y/ B1 D$ M. r. t
  15. // 创建根实例/ X8 ^4 F  m+ X- K0 f: p$ o
  16. new Vue({7 m0 d  \. Y1 q! M
  17.   el: '#app'
    ! {0 X) X0 q3 a7 C( O
  18. })7 t" z. x% B2 q8 R. I3 R2 m4 _, T
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例/ A; b, [9 Q  {8 x

% G  ]2 @+ U8 X! w3 C( X# a
  1. <div id="app">
    : R3 D* i2 _# z$ ?/ `. ~' N  i
  2.   <p>页面载入时,input 元素自动获取焦点:</p>/ q+ U1 c3 d9 @6 V" z
  3.   <input v-focus>
    # d" i0 ]/ c; x+ d4 R% W9 x2 a7 ?
  4. </div>
    + [5 e2 X1 t; e+ e1 O8 h" T% [
  5. ' O$ B1 C/ m5 w+ `0 M0 M
  6. <script>
    % i! F3 ^% J: F- ~; r1 R7 e" e- m
  7. // 创建根实例
    8 l8 Y/ }+ l0 @& P0 [
  8. new Vue({
    / L6 ]& G5 I  R7 O# ~1 p
  9.   el: '#app',$ C- ]  D9 ]  U( I7 W+ b
  10.   directives: {7 Q. U* i8 f; x: R2 e
  11.     // 注册一个局部的自定义指令 v-focus4 [5 }: c/ T) G1 Q
  12.     focus: {
      V6 [3 Y; a2 w% ]: c6 ?# u0 P! t3 ~
  13.       // 指令的定义$ {% h6 u: D3 [) B5 ~2 [
  14.       inserted: function (el) {# L! A- L2 D. K2 H3 m0 g
  15.         // 聚焦元素
    % c! v4 l- B+ A, m4 X
  16.         el.focus()
    & H' h$ Y7 ]* s1 O; W( [8 z
  17.       }5 Q* l" o) P4 b
  18.     }% f& O( S! P$ m! K- p2 J& n$ e
  19.   }; E% y; h% _* }. d
  20. })$ A/ o7 h7 @4 t5 F# V8 `
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
钩子函数参数
钩子函数的参数有:
以下实例演示了这些参数的使用:
实例
8 [& v1 t6 K5 Z0 }/ f+ h
5 N4 _; J: c. G
  1. <div id="app"  v-runoob:hello.a.b="message">
    # m( R: M- X* v& X- Y, l1 Z4 [( U3 }$ q
  2. </div>
    ( y; G$ B* S. g( [$ h$ M' ]. Q% ?

  3. 8 B, w! F. N- }' [
  4. <script>! L! R, `  K3 k3 V: \+ p
  5. Vue.directive('runoob', {% y+ m4 g8 y; M# v
  6.   bind: function (el, binding, vnode) {) A5 D$ R+ S. J, ~$ M! J! b
  7.     var s = JSON.stringify
    / n" O# ?5 m, D  _% a) {6 y
  8.     el.innerHTML =* ~% g) G% q: ]- q1 E) {
  9.       'name: '       + s(binding.name) + '<br>' +
    $ w2 s: I, s6 ]% Q
  10.       'value: '      + s(binding.value) + '<br>' +, D+ @1 y3 l" }  P8 i
  11.       'expression: ' + s(binding.expression) + '<br>' +8 f8 ]& ]8 @9 _( F$ i$ r
  12.       'argument: '   + s(binding.arg) + '<br>' +
    8 {' F4 c  T* C
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +3 k6 w) E5 V5 g
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')/ I  m% t% s2 k  i$ f: f3 y/ }6 b
  15.   }
    7 j4 A* F7 |" M8 Q
  16. })
    / y8 d- j, L8 Z1 X2 \" y7 s2 A
  17. new Vue({
    : l' d, H9 w) A+ x' @6 E
  18.   el: '#app',
      L6 y, c3 B; s' |+ P
  19.   data: {
    0 M! Q7 Z* E2 ^
  20.     message: '菜鸟教程!'
    : o5 R/ n3 Z- I
  21.   }
    8 i; y/ @; A) m3 ^' ?
  22. })
    . W+ |$ u, l0 B) y
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:' j8 n2 [, Z* h. J3 }
  1. Vue.directive('runoob', function (el, binding) {  o2 k4 f& t& s) @/ A% n9 v) Y
  2.   // 设置指令的背景颜色
    $ ~$ }8 G1 I- m' s# n, k' Q
  3.   el.style.backgroundColor = binding.value.color4 I* O6 [, K6 E
  4. })
复制代码

* ?0 n& ?( A, n
! s. m' I9 a/ J0 F' A
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
/ I9 b3 ^3 M, o3 Z4 s! J1 L# S1 s3 [+ ~
  1. <div id="app">& G; b2 \. j# J6 f" \! Z& \
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>! X, A2 {1 l0 {: L0 O& s$ N/ S
  3. </div>" O) H8 {& t% {! S: z* V2 t
  4. ( P" p; `4 u( {5 _
  5. <script>& ]6 r* V4 g* ~( \
  6. Vue.directive('runoob', function (el, binding) {5 Y: ~0 n  A/ |, T9 H
  7.     // 简写方式设置文本及背景颜色# C( @- q. t, R/ N
  8.     el.innerHTML = binding.value.text
    ! u: ~! |! f2 @$ K/ `; t# I
  9.     el.style.backgroundColor = binding.value.color% }+ E5 U. t1 j8 T
  10. })" e* ?' s* Z/ ^( e
  11. new Vue({. b& x6 A" n4 A9 H, s5 I
  12.   el: '#app'  F6 [  f# _9 r; B$ G
  13. })0 r4 u9 v% q7 C6 }, H
  14. </script>
复制代码

6 s, {- L% g( W' J8 A7 _2 @2 y4 e" I! ]
" Z! [5 d: x( Y- y# d
; n3 L, a; O3 L1 X/ x; w9 l




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