事件处理

监听事件

用v-on指令或简写@来监听DOM事件,并在事件触发时执行对应的JS

v-on:click="handler"@click="handler"

这里的handler事件处理器的值可以是:

1.内联事件处理器:事件被触发时执行的内联JS语句(与onclick类似)

data() {
  return {
    count: 0
  }
}

<button @click="count++">Add 1</button>
<p>Count is: {{ count }}</p>

2.方法事件处理器:一个指向组件上定义的方法的属性名或是路径

复制代码
data() {
  return {
    name: 'Vue.js'
  }
},
methods: {
  greet(event) {
    // 方法中的 `this` 指向当前活跃的组件实例
    alert(`Hello ${this.name}!`)
    // `event` 是 DOM 原生事件
    if (event) {
      alert(event.target.tagName)
    }
  }
}

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

方法事件处理器会自动接收原生DOM事件并触发执行,可以通过被触发事件的event.target.tagName访问到该DOM元素

在内联事件处理器中调用方法

即除了直接绑定方法名,也可以在内联处理器调用方法,这是可以向方法中传入自定义参数代替原生事件

methods: {
  say(message) {
    alert(message)
  }
}

<button @click="say('hello')">Say hello</button>
<button @click="say('bye')">Say bye</button>

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

有时候需要在内联事件处理器中访问原生DOM事件,这时可以通过如下两种方式实现:

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

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

methods: {
  warn(message, event) {
    // 这里可以访问 DOM 原生事件
    if (event) {
      event.preventDefault()
    }
    alert(message)
  }
}
复制代码

事件修饰符

在处理事件时调用event.preventDefault()或event.stopPropagation()是比较常见的,

我们当然可以直接在方法内调用,但为使方法更专注于处理数据逻辑,

Vue为v-on提供了事件修饰符即用.打头的指令后缀,如下:

复制代码
<!-- 单击事件将停止传递 -->
<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>
复制代码

tips:使用修饰符时注意调用顺序,如:

@click.prevent.self会组织元素及其子元素的所有事件的默认行为

@click.self.prevent只会阻止对元素本身的点击事件的默认行为

.capture / .once / .passive 修饰符与原生addEventListener事件相对应

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

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

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

 

按键修饰符

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

可以直接使用KeyboardEvent.key暴露的按键名作为修饰符,但需要转化为kebab-case形式(短横线)

<input @keyup.page-down="onPageDown" />

上例只有在$event.key为 'PageDown'时才调用事件处理

键盘事件:

keydown:键盘按下后触发

keyup:键盘按下抬起后触发

 

posted @   宅马花子  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示