1. v-on(简写@)侦听DOM事件,vue自定义事件

2. 事件处理器类型

1)内联事件处理器,实现简单逻辑
2)方法事件处理器,实现复杂逻辑

// 方法定义
const name = ref('Vue.js')

function greet(event) {
  alert(`Hello ${name.value}!`)
  // `event` 是 DOM 原生事件
  if (event) {
    alert(event.target.tagName)
  }
}

<!-- `greet` 是上面定义过的方法名 -->
<button @click="greet">Greet</button>

3. 参数传递问题

1)如上greet方法事件处理器,默认传入事件event
2)在内联语句中调用方法,可以传入自定义参数

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

3)在内敛语句中使用特殊变量$event, 箭头函数

<!-- 使用特殊的 $event 变量 -->
<button @click="warn('Form cannot be submitted yet.', $event)">
  Submit
</button>

<!-- 使用内联箭头函数 -->
<button @click="(event) => warn('Form cannot be submitted yet.', event)">
  Submit
</button>

4. 事件修饰符

多类事件修饰符
1)基于DOM事件event本身的一些逻辑

<!-- 单击事件将停止传递 event.stopPropagation() -->
<a @click.stop="doThis"></a>

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

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

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

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

<!-- 注意链式修饰符的向后顺序 -->
@click.prevent.self 会阻止元素及其子元素的所有点击事件的默认行为,而 @click.self.prevent 则只会阻止对元素本身的点击事件的默认行为。

2)基于原生 addEventListener 事件相对应

<!-- 添加事件监听器时,使用 `capture` 捕获模式 -->
<!-- 例如:指向内部元素的事件,在被内部元素处理前,先被外部处理 -->
<div @click.capture="doThis">...</div>

<!-- 点击事件最多被触发一次 -->
<a @click.once="doThis"></a>

<!-- 滚动事件的默认行为 (scrolling) 将立即发生而非等待 `onScroll` 完成 -->
<!-- 以防其中包含 `event.preventDefault()` -->
<div @scroll.passive="onScroll">...</div>

5. 键盘键修饰符/常用按键别名

<!-- 仅在 key 为 `Enter` 时调用 `submit` -->
<input @keyup.enter="submit" />

<!-- 仅在 key 为 'PageDown' 时调用, 特别注意转为 kebab-case -->
<input @keyup.page-down="onPageDown" />

按键别名如下

// 常用按键
.enter
.tab
.delete (捕获“Delete”和“Backspace”两个按键)
.esc
.space
.up
.down
.left
.right
// 系统按键
.ctrl
.alt
.shift
.meta

组合按键

<!-- Alt + Enter -->
<input @keyup.alt.enter="clear" />

<!-- Ctrl + 点击 -->
<div @click.ctrl="doSomething">Do something</div>

.exact 修饰符

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

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

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

6. 鼠标按键修饰符

这些修饰符将处理程序限定为由特定鼠标按键触发的事件。

.left
.right
.middle