Vue3 事件处理
监听事件
我们可以使用 v-on
指令 (通常缩写为 @
符号) 来监听 DOM 事件,并在触发事件时执行一些 JavaScript。
用法为 v-on:click="methodName"
或使用快捷方式 @click="methodName"
事件处理方法
v-on
还可以接收一个需要调用的方法名称。
1 | <div id="event-with-method"> |
1 | Vue.createApp({ |
内联处理器中的方法
可以在内联 JavaScript 语句中调用方法:
1 | <div id="inline-handler"> |
1 | Vue.createApp({ |
多事件处理器
事件处理程序中可以有多个方法,这些方法由逗号运算符分隔:
1 | <button @click="one($event), two($event)"> |
1 | methods: { |
事件修饰符
在事件处理程序中调用 event.preventDefault()
或 event.stopPropagation()
是非常常见的需求。
Vue.js 为 v-on
提供了事件修饰符。
.stop
.prevent
.capture
.self
.once
.passive
1 | <!-- 阻止单击事件继续冒泡 --> |
TIP
使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用
@click.prevent.self
会阻止元素本身及其子元素的点击的默认行为,而@click.self.prevent
只会阻止对元素自身的点击的默认行为。
1 | <!-- 点击事件将只会触发一次 --> |
Vue 还对应 addEventListener
中的 passive 选项提供了 .passive
修饰符。
1 | <!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发, --> |
.passive
修饰符尤其能够提升移动端的性能。
按键修饰符
在监听键盘事件时,我们经常需要检查特定的按键。
1 | <!-- 只有在 `key` 是 `Enter` 时调用 `vm.submit()` --> |
你可以直接将 KeyboardEvent.key
暴露的任意有效按键名转换为 kebab-case 来作为修饰符。
按键别名
Vue 为最常用的键提供了别名:
.enter
.tab
.delete
(捕获“删除”和“退格”键).esc
.space
.up
.down
.left
.right
系统修饰键
可以用如下修饰符来实现仅在按下相应按键时才触发鼠标或键盘事件的监听器。
.ctrl
.alt
.shift
.meta
TIP
在 Mac 系统键盘上,meta 对应 command 键 (⌘)。在 Windows 系统键盘 meta 对应 Windows 徽标键 (⊞)。在 Sun 操作系统键盘上,meta 对应实心宝石键 (◆)。在其他特定键盘上,尤其在 MIT 和 Lisp 机器的键盘、以及其后继产品,比如 Knight 键盘、space-cadet 键盘,meta 被标记为“META”。在 Symbolics 键盘上,meta 被标记为“META”或者“Meta”。
1 | <!-- Alt + Enter --> |
TIP
请注意修饰键与常规按键不同,在和
keyup
事件一起用时,事件触发时修饰键必须处于按下状态。换句话说,只有在按住ctrl
的情况下释放其它按键,才能触发keyup.ctrl
。而单单释放ctrl
也不会触发事件。
.exact
修饰符
.exact
修饰符允许你控制由精确的系统修饰符组合触发的事件。
1 | <!-- 即使 Alt 或 Shift 被一同按下时也会触发 --> |
鼠标按钮修饰符
.left
.right
.middle
这些修饰符会限制处理函数仅响应特定的鼠标按钮。
为什么在 HTML 中监听事件?
使用 v-on
或 @
有几个好处:
- 扫一眼 HTML 模板便能轻松定位在 JavaScript 代码里对应的方法。
- 因为你无须在 JavaScript 里手动绑定事件,你的 ViewModel 代码可以是非常纯粹的逻辑,和 DOM 完全解耦,更易于测试。
- 当一个 ViewModel 被销毁时,所有的事件处理器都会自动被删除。你无须担心如何清理它们。