|
事件监听可以使用 v-on 指令: v-on+ B/ y0 x9 d1 ]/ G4 c5 o$ |. P
- <div id="app">( w" J. P/ a$ n% d- L2 Q0 d
- <button v-on:click="counter += 1">增加 1</button>
6 h; U7 @. A+ _ - <p>这个按钮被点击了 {{ counter }} 次。</p> ~- o; i, b2 N( b6 T1 ?- e8 r* Z+ P
- </div>
; b& J2 d1 _6 Y" v/ M -
: T4 N: c7 L8 t - <script>
. H! ~% x; z* X7 t1 C8 { - new Vue({
( W2 \+ k& k# N% b+ v- o - el: '#app',: o3 g6 d; e1 [- o3 Y' ~
- data: {. N' Q! W3 F% z& ?
- counter: 0, |& w0 ~, ]9 l L4 }' A' f
- }; i: e: r4 t. d1 r9 q7 f& o
- })
3 |3 m, L. {( x2 b - </script>
复制代码通常情况下,我们需要使用一个方法来调用 JavaScript 方法。 v-on 可以接收一个定义的方法来调用。 v-on
# ~2 ~1 R3 I5 K0 S$ F% V- <div id="app">
* I" @2 Q/ E( e5 l7 G. ^" F - <!-- `greet` 是在下面定义的方法名 -->
G! k$ h9 G) { - <button v-on:click="greet">Greet</button>
( G( ^' O6 r3 t$ t9 I - </div>
, I& ?" P. m' J+ }! Z - ! r$ E. ?0 k! {7 f8 }5 {
- <script>
3 H& A. }# q5 {8 {9 a! J - var app = new Vue({
% [. o& @* q2 c7 j! ]/ K9 } - el: '#app',9 P" {; ~, K9 U3 q
- data: { k0 \4 d# h% M+ ]% F& ? x
- name: 'Vue.js'3 B! ]$ R" }7 c# i6 ]9 A
- },+ R6 y9 R! p& ~% M x1 H
- // 在 `methods` 对象中定义方法
$ T0 b" J4 g' C9 O& a# [ - methods: {
: L% S1 X& K; n - greet: function (event) {
/ f1 r9 M( h4 |- A+ c - // `this` 在方法里指当前 Vue 实例$ G. x. _; b, d3 P: f
- alert('Hello ' + this.name + '!'). a- h2 \; q3 Q; y( E2 }+ U
- // `event` 是原生 DOM 事件
* ^6 l2 c6 u4 U8 ?( x - if (event) {
7 r4 s) K) o0 i/ L' J$ a - alert(event.target.tagName)
* Y9 y4 n9 N j) u - }6 b) C% W# c# N* I( q' r; K
- }
; E, Y$ l$ m2 K) _ - }7 G4 u5 b0 N, u! N1 V( N6 V" H
- })
1 m" P/ }4 x) [6 f - // 也可以用 JavaScript 直接调用方法
6 G w# h4 R# Y) \ - app.greet() // -> 'Hello Vue.js!'. b$ p. @' k F8 `0 @" }* X4 _+ ^
- </script>
复制代码除了直接绑定到一个方法,也可以用内联 JavaScript 语句: v-on
9 B4 i. s( }& U8 M- D/ @6 W' b- <div id="app"> e; T0 g, t; @& P% k* A
- <button v-on:click="say('hi')">Say hi</button>
' O7 [8 Q P( t8 E2 ~# I - <button v-on:click="say('what')">Say what</button>: A2 l( U2 t( k
- </div>( ]0 i6 B( t# S1 D) R9 J" M' `4 ~: d8 V
- H/ u5 p+ I' u; s
- <script>. D7 O3 u' ~ T: b p' g3 ]. f
- new Vue({
9 L9 R% e- j+ x5 w+ j5 T - el: '#app',! T# y/ T0 R! A7 C
- methods: {* \7 h. C% l9 p5 B0 y6 g
- say: function (message) {& y$ k& r8 \0 w
- alert(message)! _* z8 h0 h- I4 M
- }4 L' }: U9 F& ^0 [' ~
- }
1 C$ U j7 J2 G, @0 H2 n2 e - })
2 b) g0 h2 j! _ - </script>
复制代码 事件修饰符Vue.js 为 v-on 提供了事件修饰符来处理 DOM 事件细节,如:event.preventDefault() 或 event.stopPropagation()。 Vue.js通过由点(.)表示的指令后缀来调用修饰符。 - .stop
- .prevent
- .capture
- .self
- .once
; V; q1 A' x2 z) E& p8 H0 l& ]# w. x
- <!-- 阻止单击事件冒泡 -->
& t! K1 |* l( a3 c - <a v-on:click.stop="doThis"></a>7 M4 A8 H5 U" @8 x) W- l
- <!-- 提交事件不再重载页面 -->
2 Y a0 F8 k ?4 j* v; h9 a- _. D - <form v-on:submit.prevent="onSubmit"></form>; [ r" n2 t/ v
- <!-- 修饰符可以串联 -->
' f5 ^( _* N! n' I$ Q/ s6 V' E7 [ - <a v-on:click.stop.prevent="doThat"></a>
6 \ {% K* d4 u! b - <!-- 只有修饰符 -->
# C- R0 F4 K5 N - <form v-on:submit.prevent></form>- r" v. ~% X2 ?7 K9 |3 R
- <!-- 添加事件侦听器时使用事件捕获模式 -->. D% L& H0 L0 \6 X
- <div v-on:click.capture="doThis">...</div>
# f0 z$ V* e" v( c$ C6 G9 n - <!-- 只当事件在该元素本身(而不是子元素)触发时触发回调 -->8 B/ X* v( y# }2 G/ C0 p
- <div v-on:click.self="doThat">...</div>
# B5 p. {' K# A; N- {! } - - P( Y9 k1 @' H6 R3 J0 L
- <!-- click 事件只能点击一次,2.1.4版本新增 -->. ~+ E! z$ e% V" o
- <a v-on:click.once="doThis"></a>
复制代码 按键修饰符Vue 允许为 v-on 在监听键盘事件时添加按键修饰符: - <!-- 只有在 keyCode 是 13 时调用 vm.submit() -->
8 X3 }- s0 W: q5 P: c - <input v-on:keyup.13="submit">
复制代码 记住所有的 keyCode 比较困难,所以 Vue 为最常用的按键提供了别名:
- K Z* |9 p$ ~; @- <!-- 同上 -->% n; m0 H# i3 g( c6 k% _# r2 |
- <input v-on:keyup.enter="submit">; q# _2 [3 \5 q# k/ a
- <!-- 缩写语法 -->0 E+ D& @4 n: f2 L6 \" c
- <input @keyup.enter="submit">
复制代码全部的按键别名: - .enter
- .tab
- .delete (捕获 "删除" 和 "退格" 键)
- .esc
- .space
- .up
- .down
- .left
- .right
- .ctrl
- .alt
- .shift
- .meta7 T) |/ D( U$ ^! o9 o7 E7 G
实例
" v+ K2 ?- K: r/ z' b- <p><!-- Alt + C -->) v/ r6 J: v% g9 E
- <input @keyup.alt.67="clear">
% |; \* I! ^8 o - <!-- Ctrl + Click -->8 m5 S0 t7 V$ R$ y8 d8 J
- <div @click.ctrl="doSomething">Do something</div>
复制代码 computed 对象内的方法如果在初始化时绑定到元素上的事件会先执行一次这个方法 ,而 methods 内的方法则不会;例如以下实例初始化时会自动执行一遍 name1 和 greet 这两个方法:
9 A J6 N6 h7 _: Q1 W" X; v1 Z1 C' B: ]3 }- var app = new Vue({5 h) E* F, w! O5 F6 X$ B
- el: '#app', T1 m8 R h& n8 Y
- data: {2 V3 A% h# V( q$ e- X
- name: 'Vue.js'
# f; ^8 |9 F0 m3 Y - },
: v- G2 _4 S& n5 s g; d# m - // 在 `methods` 对象中定义方法
3 h/ h( m% y' z% ^& z" z7 |& d. n - computed: {
# ?/ ]! I. T( s# H( } - name1: function(){ alert('222') },& D2 Y) x& p1 b8 ?" M( K
- greet: function (event) {
2 T% J/ a# D0 S/ P) k - // `this` 在方法里指当前 Vue 实例
8 f1 E7 K& R- c" C- Y - alert('Hello ' + this.name + '!')
( C6 X- ]' G4 F: T7 @ L - // `event` 是原生 DOM 事件, b5 y3 V: I9 o5 G
- if (event) {
# l3 F4 n& C! ^ L2 u - alert(event.target.tagName)% Y8 {6 G+ K& }( X# R8 m& R
- }; c3 k7 M: u U+ _' p+ i; y
- }
, S# z5 `. U% F6 j9 I9 R, \ - }
; I j+ z; C: J3 W) e8 p - })7 s9 e. r6 f" ^+ z* v
- // 也可以用 JavaScript 直接调用方法
复制代码 * e) N' P. }: X- P4 F
: P- b, n( X& l% f2 \
. P- f* q2 J( m8 ]0 K' X- t1 @
9 [+ j3 d# y1 N1 i, j. G4 g
) e" ^+ l9 _: g3 q. B |