当前位置: 首页 > news >正文

vue3事件处理详解

一、事件绑定基础(v-on/@

1. 基本语法

<button v-on:click="handleClick">点击</button> <!-- 简写 --> <button @click="handleClick">点击</button>
<script setup lang="ts"> const handleClick = () => { console.log('clicked') } </script>

要点

  • @v-on:的语法糖

  • Vue 3 中事件函数通常定义在setup()<script setup>

  • 事件名默认是DOM 原生事件


2. 内联事件表达式

<button @click="count++">+</button> <p>{{ count }}</p>
const count = ref(0)

说明

  • 可直接写 JS 表达式

  • 适合简单逻辑,不建议写复杂业务


二、事件参数与$event

1. 获取事件对象

<button @click="handleClick">点击</button>
const handleClick = (event: MouseEvent) => { console.log(event.target) }

Vue 会自动注入$event


2. 同时传自定义参数 + 事件对象

<button @click="handleClick(1, $event)">点击</button>
const handleClick = (id: number, event: MouseEvent) => { console.log(id, event) }

三、事件修饰符(重点)

1. 阻止冒泡 / 默认行为

修饰符作用
.stopevent.stopPropagation()
.preventevent.preventDefault()
<a href="#" @click.prevent>阻止默认</a> <div @click="parent"> <button @click.stop="child">子按钮</button> </div>

2. 捕获、只触发一次

修饰符作用
.capture捕获阶段触发
.once只执行一次
<button @click.once="submit">提交</button>

3. 键盘事件修饰符

<input @keyup.enter="submit" /> <input @keyup.esc="cancel" />

常用键:

  • .enter

  • .esc

  • .tab

  • .space

  • .delete

  • .up / down / left / right


4. 系统按键修饰符

<button @click.ctrl="doSomething">Ctrl + Click</button> <button @keyup.alt.enter="submit" />

支持:

  • .ctrl

  • .alt

  • .shift

  • .meta(Mac Command / Windows Win)


5. 鼠标按钮修饰符

<button @click.left>左键</button> <button @click.right.prevent>右键</button> <button @click.middle>中键</button>

四、事件处理与 Composition API

1.setup中事件绑定(推荐)

<script setup lang="ts"> const handleSubmit = () => { console.log('submit') } </script> <template> <button @click="handleSubmit">提交</button> </template>

2. 使用ref操作 DOM 绑定事件(不推荐优先)

<template> <button ref="btn">按钮</button> </template> <script setup lang="ts"> const btn = ref<HTMLButtonElement>() onMounted(() => { btn.value?.addEventListener('click', () => { console.log('native click') }) }) </script>

建议

  • 优先使用@click

  • 仅在第三方库或特殊场景操作 DOM


五、自定义事件(组件通信,核心)

1. 子组件触发事件(emit

<!-- Child.vue --> <script setup lang="ts"> const emit = defineEmits<{ (e: 'update', value: number): void }>() const add = () => { emit('update', 1) } </script> <template> <button @click="add">+1</button> </template>

2. 父组件监听事件

<Child @update="handleUpdate" />
const handleUpdate = (val: number) => { console.log(val) }

3. 事件命名规范(重要)

场景推荐
组件事件kebab-case
v-modelupdate:modelValue
emit('update:modelValue', newValue)

六、v-model本质是事件

1. v-model 等价写法

<Child v-model="value" />

等价于:

<Child :modelValue="value" @update:modelValue="value = $event" />

2. 多个 v-model(Vue 3 特性)

<Child v-model:title="title" v-model:visible="visible" />

子组件:

emit('update:title', 'new title') emit('update:visible', true)

http://www.cnnetsun.cn/news/92356.html

相关文章:

  • YOLO目标检测入门:手把手教你跑通第一个demo
  • 1小时搭建:VSCode远程开发环境原型
  • 电商项目实战:Vue3父子组件传值最佳实践
  • 【LLM基础教程】从序列切分到上下文窗口01_为什么序列建模必须切分数据
  • 备赛三--
  • 高并发时代的“确定性”挑战——为何稳定性正在成为 JVM 的下一场核心竞争?
  • C语言之最大公约数和最小公倍数问题
  • LobeChat能否对接Telegram Bot?跨平台消息同步实现
  • AI如何用博图加速工业自动化开发
  • C++:二叉搜索树(BST)完全指南(从概念原理、核心操作到底层实现)
  • Splashtop AEM 在 G2冬季报告中斩获“最佳预估 ROI”殊荣
  • 赋能传统硬件:具身智能如何激活工业机器人的二次生命
  • 【模板:求组合数】信息学奥赛一本通 1648:【例 1】「NOIP2011」计算系数 | 1866:【11NOIP提高组】计算系数 | 洛谷 P1313 [NOIP 2011 提高组] 计算系数
  • 金运环球:金价高位回落,非农与零售数据即将来袭
  • 活动力度大的门头招牌企业
  • 【毕业设计】基于JavaWeb的兽医站管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • Java毕设选题推荐:基于JavaWeb的兽医站管理系统的设计与实现现代化兽医站管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Arduino配置8266开发板
  • 【课程设计/毕业设计】基于SpringBoot+Vue茶叶销售系统的设计与实现基于Java语言的茶叶销售系统的前端设计与实现【附源码、数据库、万字文档】
  • 41. 缺失的第一个正数
  • 打了一堆板子,才发现是VDD_EXT的锅
  • 技术亲民倒计时!飞猫 RedCap 轻量化 5G 随身 WiFi 即将上市!
  • # 深入 Ascend C 内存模型:掌握UB、GM与流水线优化,打造极致AI算子
  • 冥想第一千七百三十五天(1735)
  • 代理IP和普通IP有什么区别?这篇文章帮你捋明白
  • 体系结构分类和指令系统
  • 基于AI数字人系统源码的低成本开发方案与实践经验
  • SQL 调优全解:从 20 秒到 200 ms 的 6 步实战笔记(附脚本)
  • YOLO目标检测模型如何对接Apipost平台
  • 简单的创建一个Spring Boot网页