Skip to content

事件处理

监听事件

v-on或简写@用于监听DOM事件,并在触发时执行一些JavaScript代码 :

cv-on:click="handler" / @click="handler"

handler可以是一个方法名,也可以是一个表达式,如cv-on:click="count++"

内联事件处理器

内联事件处理器可以直接在模板中编写,如:

html
<button @click="count++">Add 1</button>

方法事件处理器

一些稍微复杂的逻辑,使用个内联代码就不够灵活了,这时可以使用方法事件处理器 :

html
<button @click="increment">Add 1</button>
javascript
const count = ref(0)
function increment() {
  count.value++
}

方法事件处理器会自动接收原生DOM事件并触发执行,需要处理时可以在方法中添加参数:

html
<button @click="increment(5)">Add 5</button>
javascript
function increment(value, event) {
  count.value += value
  // `event` 是 DOM 原生事件
  if (event) {
    alert(event.target.tagName)
  }
}

方法与内联事件判断

模板编译器会通过检查v-on的值是否是合法的JavaScript表达式来决定是使用方法还是内联事件处理器。 举例来说,foofoo.barfoo['bar']会被视为方法事件处理器,而foo()count++会被视为内联事件处理器。

在内联处理器中调用方法

除了直接绑定方法名,还可以再内联事件处理器中调用方法

javascript
function say(message) {
  alert(message)
}
html
<button @click="say('hello')">Say hello</button> <button @click="say('bye')">Say bye</button>

在内联事件处理器中访问事件参数

需要在内联事件处理器中访问DOM原生事件时,可以使用$event变量来访问它:

html
<button @click="warn('Form cannot be submitted yet.', $event)">Submit</button>
javascript
function warn(message, event) {
  alert(message)
  // 阻止默认事件
  event.preventDefault()
}

事件修饰符

处理事件时,调用event.preventDefault()event.stopPropagation()是很常见的需求,Vue提供了一些事件修饰符来简化这些操作。 修饰符可以连缀在事件名之后,如@click.prevent.修饰符可以串联使用,如@click.prevent.stop. Vue提供的时间修饰符包括:

  • .stop - 调用event.stopPropagation()
  • .prevent - 调用event.preventDefault()
  • .self - 只在事件目标是当前元素时触发
  • .capture - 添加事件监听器时使用事件捕获模式
  • .once - 只触发一次事件监听器
  • .passive - 添加事件监听器时使用被动模式,允许浏览器优化滚动性能
html
<!-- 单击事件将停止传递 -->
<a @click.stop="doThis"></a>

<!-- 提交事件将不再重新加载页面 -->
<form @submit.prevent="onSubmit"></form>

<!-- 修饰语可以使用链式书写 -->
<a @click.stop.prevent="doThat"></a>

<!-- 也可以只有修饰符 -->
<form @submit.prevent></form>

<!-- 仅当 event.target 是元素本身时才会触发事件处理器 -->
<!-- 例如:事件处理器不来自子元素 -->
<div @click.self="doThat">...</div>

TIP 使用修饰符时要注意顺序,因为代码会以添加的修饰符的顺序执行,比如 @click.prevent.self 会阻止所有的点击,而@click.self.prevent 只会阻止对自身元素的点击。

按键修饰符

通事件修饰符类似,Vue也提供了按键修饰符,用于监听键盘事件,如@keyup.enter@keyup.space等。 按键修饰符可以连缀在事件名之后,如@keyup.enterVue提供了一些常用的按键修饰符,包括:

  • .enter
  • .tab
  • .delete (捕获“删除”和“退格”键)
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right

系统按键修饰符

系统按键修饰符用于监听系统按键,如CtrlAltShift等。 系统按键修饰符可以连缀在事件名之后,如@keyup.ctrl.enterVue提供了一些常用的系统按键修饰符,包括:

  • .ctrl
  • .alt
  • .shift
  • .meta
html
<!-- Alt + Enter -->
<input @keyup.alt.enter="clear" />
<!-- Ctrl + Click -->
<div @click.ctrl="doSomething">Do something</div>

.exact修饰符

.exact修饰符用于精确匹配按键组合,只有当指定的按键组合被按下时才会触发事件处理器。

html
<!-- 当按下 Ctrl 时,即使同时按下 Alt 或 Shift 也会触发 -->
<button @click.ctrl="onClick">A</button>

<!-- 仅当按下 Ctrl 且未按任何其他键时才会触发 -->
<button @click.ctrl.exact="onCtrlClick">A</button>

<!-- 仅当没有按下任何系统按键时触发 -->
<button @click.exact="onClick">A</button>

鼠标修饰符

鼠标修饰符用于监听鼠标事件,如@click.left@click.right等。 .left,.right 和 .middle 这些修饰符名称是基于常见的右手用鼠标布局设定的,但实际上它们分别指代设备事件触发器的“主”、”次“,“辅助”,而非实际的物理按键。