您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 14305|回复: 0
打印 上一主题 下一主题

[Vue.js] Vue.js 事件处理器

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:15:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
事件监听可以使用 v-on 指令:
v-on" I5 j  N  T% J+ b+ p
  1. <div id="app">$ T9 w9 C/ ]7 q1 p; ?
  2.   <button v-on:click="counter += 1">增加 1</button>
    % ?& ~$ I* W3 E
  3.   <p>这个按钮被点击了 {{ counter }} 次。</p>% [7 ~3 J( P9 r
  4. </div>
    9 ]( }/ h/ e9 _: p; ~) }
  5. % g2 o9 A5 X+ T# G5 q
  6. <script>
      e1 z8 @( H" e' ]; P
  7. new Vue({! F! X& Y- ~" J, E% x7 I7 }
  8.   el: '#app',- R4 Z7 W) l3 W# [( J  ]. f" j
  9.   data: {( ?  f, x. R& K
  10.     counter: 0! |/ n6 c$ i9 P4 v4 t  ^7 ~5 O6 R
  11.   }
    0 |4 ?/ a5 K+ a! n) ?( S0 j4 @
  12. })" R& U. @  R& f+ O2 b% y
  13. </script>
复制代码
通常情况下,我们需要使用一个方法来调用 JavaScript 方法。
v-on 可以接收一个定义的方法来调用。
v-on( Z9 T+ H2 v  d$ h: v
  1. <div id="app">  Z: c  S, ]2 {+ g6 H& C
  2.    <!-- `greet` 是在下面定义的方法名 -->$ P) U- D- Q6 S, D' z) m( U
  3.   <button v-on:click="greet">Greet</button>
    ! v; `* ?3 {" d# e9 l" u; T
  4. </div>8 I" G9 @8 v# O6 d4 B0 b: m
  5. 4 H) R# i$ k3 x8 q
  6. <script>( l8 P) b- o: D( v! ]$ {
  7. var app = new Vue({
    3 V% D# k5 y- x- u
  8.   el: '#app',6 L9 ]/ {) O. x* H, w1 b
  9.   data: {0 L- c: }$ V* A( b
  10.     name: 'Vue.js'
    ! D7 g& D7 G( m3 e1 h9 w- m
  11.   },3 W$ w) G: M! M, L
  12.   // 在 `methods` 对象中定义方法. s; t' C' T" o' _6 n8 ^$ n
  13.   methods: {+ f" \1 C0 l6 E
  14.     greet: function (event) {5 O# }( o6 x1 w( X+ B3 C5 T) F
  15.       // `this` 在方法里指当前 Vue 实例
    & e- U  k- ^, a. c
  16.       alert('Hello ' + this.name + '!')
    ! t' h; D9 \9 q5 ?
  17.       // `event` 是原生 DOM 事件
    ) ~. T4 i9 D% M1 A$ i" ?
  18.       if (event) {
    % o; T$ A& h5 f* Q6 A: t3 ~6 E
  19.           alert(event.target.tagName). e( d8 t+ T  k9 ]5 O. p5 F# w
  20.       }$ L8 c+ F* I7 C# S
  21.     }
    ) I) C: o" ~5 |  c8 c7 z
  22.   }
    ; M9 f8 e. r' \5 O
  23. })
    . U% |4 a- F' m4 R. c
  24. // 也可以用 JavaScript 直接调用方法" s, i1 L; \/ I. L- z# `! `
  25. app.greet() // -> 'Hello Vue.js!'
    4 D. S  Q- d. W& p: `
  26. </script>
复制代码
除了直接绑定到一个方法,也可以用内联 JavaScript 语句:
v-on
/ x; T4 w5 y* x" M& F. n) S
  1. <div id="app">  }- I7 n8 w" r
  2.   <button v-on:click="say('hi')">Say hi</button>, J% x8 O' X7 k
  3.   <button v-on:click="say('what')">Say what</button>. V$ t9 Y  _, N& I
  4. </div>
    + P( n5 v* ?, B" V* j

  5. 2 @. H/ c+ `/ y) e9 j& }( H
  6. <script>
    0 R6 Q# s5 n4 M& s' t
  7. new Vue({
    5 _  E3 S- K7 b  d. z0 p/ D
  8.   el: '#app',, T1 t5 _0 D7 u$ h7 Z5 d! g! p
  9.   methods: {+ T8 H5 ~* f6 y7 t" i3 N% M/ b
  10.     say: function (message) {: a7 `1 a* n, L; ^: S6 d$ b# H
  11.       alert(message)* B- K# X  u6 z, U0 R! g' [  X
  12.     }/ x2 V" X; x* N
  13.   }
    , E# {0 K" s  A. I+ D! T. F
  14. })
    ( R% s& h8 p( l& T) b) `9 p! m
  15. </script>
复制代码
事件修饰符
Vue.js 为 v-on 提供了事件修饰符来处理 DOM 事件细节,如:event.preventDefault() 或 event.stopPropagation()。
Vue.js通过由点(.)表示的指令后缀来调用修饰符。
  • .stop
  • .prevent
  • .capture
  • .self
  • .once+ ^1 o& X1 M& B2 X! |
  1. <!-- 阻止单击事件冒泡 -->3 ~. [. k: Y$ @! q
  2. <a v-on:click.stop="doThis"></a>% L, q2 j0 z8 U7 C: @# t
  3. <!-- 提交事件不再重载页面 -->$ P7 u) t5 x7 v
  4. <form v-on:submit.prevent="onSubmit"></form>
    6 G% u: v6 g$ ~, N. R4 _& [4 S
  5. <!-- 修饰符可以串联  -->
    7 |, g* |! h" O1 a
  6. <a v-on:click.stop.prevent="doThat"></a>" X' Q, h) h; g' v5 \2 z
  7. <!-- 只有修饰符 -->
    7 r; J4 K# @3 p7 Q8 K
  8. <form v-on:submit.prevent></form># K" n( u- C! t- q( z/ C/ R# Z
  9. <!-- 添加事件侦听器时使用事件捕获模式 -->
    / A. M) k" E6 h, u5 u; O  `
  10. <div v-on:click.capture="doThis">...</div>
    ! C9 o8 N8 s5 j
  11. <!-- 只当事件在该元素本身(而不是子元素)触发时触发回调 -->
    % _9 L) M2 u5 x
  12. <div v-on:click.self="doThat">...</div>8 v* y, k4 Q8 D
  13. 2 G+ c+ |% \* p* l" h
  14. <!-- click 事件只能点击一次,2.1.4版本新增 -->: j/ p- X5 C1 S2 K# ^
  15. <a v-on:click.once="doThis"></a>
复制代码
按键修饰符
Vue 允许为 v-on 在监听键盘事件时添加按键修饰符:
  1. <!-- 只有在 keyCode 是 13 时调用 vm.submit() -->" X; H& b  N8 s
  2. <input v-on:keyup.13="submit">
复制代码
记住所有的 keyCode 比较困难,所以 Vue 为最常用的按键提供了别名:
' E* |. D% H% l# U# k
  1. <!-- 同上 -->
    4 z% r3 Q2 E! m6 p
  2. <input v-on:keyup.enter="submit">
    ! b5 w1 ~! f7 A
  3. <!-- 缩写语法 -->8 Y, U, w+ s  D
  4. <input @keyup.enter="submit">
复制代码
全部的按键别名:
  • .enter
  • .tab
  • .delete (捕获 "删除" 和 "退格" 键)
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right
  • .ctrl
  • .alt
  • .shift
  • .meta
    : d7 h& V* y9 I' l7 U8 T8 N6 o
实例

! U- T8 h" D. M
  1. <p><!-- Alt + C -->
    / h' A0 A2 k% j4 ]; H
  2. <input @keyup.alt.67="clear">
    ! g1 }, q: F) l1 V- X3 a; Z
  3. <!-- Ctrl + Click -->0 z$ M# q  u: ?- ^5 r1 j9 U
  4. <div @click.ctrl="doSomething">Do something</div>
复制代码
computed 对象内的方法如果在初始化时绑定到元素上的事件会先执行一次这个方法 ,而 methods 内的方法则不会;例如以下实例初始化时会自动执行一遍 name1 和 greet 这两个方法:0 {5 n; I' E) G, x  R
  1. var app = new Vue({
    ' O' p8 G0 ], s& _) a2 q4 W0 d
  2.     el: '#app',
    - A; f) M6 ^8 b& d" T5 I
  3.     data: {
    9 ?8 r: j0 L. e$ w# Y3 }0 X) ?/ K
  4.         name: 'Vue.js'% ?( \" J# T8 \2 B
  5.     },; X- W5 `" M. p; l) B( T
  6.     // 在 `methods` 对象中定义方法+ u7 U# V' }# J, w4 {, p. b* k
  7.     computed: {
    ; A* l' G5 S) k. |& Y4 u
  8.         name1: function(){  alert('222') },2 I5 f. m' J6 I; d1 r
  9.         greet: function (event) {% s( w4 N; {% w3 Q
  10.             // `this` 在方法里指当前 Vue 实例/ o# Q3 l' s! a9 T, Z& k! B
  11.             alert('Hello ' + this.name + '!')# F! s3 @/ P/ A( G+ S
  12.             // `event` 是原生 DOM 事件1 }) i/ J0 q3 o
  13.             if (event) {6 h( P/ K8 Y7 ?6 A5 y5 y8 n, ~: V
  14.                 alert(event.target.tagName)
    6 Q" I( D( s. W' c" @& x
  15.             }* x2 O) Z. i/ z
  16.         }
    & T. z3 w1 A; J/ `  F
  17.     }1 k4 \; e! J+ Q3 [: s
  18. })
    ) M7 U5 D" o* R! P$ w
  19. // 也可以用 JavaScript 直接调用方法
复制代码
+ h' [! w" X/ \
" {' t. i5 M) |3 }" z7 C7 `
+ I) L1 }: |! \5 ?5 o
' m& v% G  W9 Z- r
6 p, ~: e( u  ]' K( x5 K+ }- L
8 N  m: d1 O  S0 ^) N9 }- |1 \6 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 18:24 , Processed in 0.051327 second(s), 19 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!