Vue3中的事件监听与处理机制深度解析

随着Vue3的发布,其在性能、灵活性和易用性上都实现了显著提升。其中,事件监听和处理机制作为Vue框架中的重要组成部分,也进行了相应的优化与升级。本文将深入探讨Vue3中如何进行事件监听与处理。

一、Vue3事件绑定

在Vue3中,我们依然使用v-on(简写为@)指令来监听并处理DOM事件。例如:

<template><button @click="handleClick">点击我</button>
</template><script setup>
import { ref } from 'vue';const handleClick = () => {console.log('按钮被点击了');
};
</script>

上述代码中,@click="handleClick"表示当按钮被点击时,会触发handleClick方法。这里引入了Vue3新的脚本编写模式——setup script,它使得逻辑更接近React Hooks的编程风格。

二、Vue3的事件处理函数

Vue3采用了Composition API,因此我们可以直接在setup函数内部定义并引用事件处理函数。此外,Vue3还支持响应式地更新事件处理器,这是Vue2所不具备的特性。

import { ref, onMounted, onUnmounted } from 'vue';let count = ref(0);function handleClick() {count.value++;
}onMounted(() => {document.getElementById('myButton').addEventListener('click', handleClick);
});onUnmounted(() => {document.getElementById('myButton').removeEventListener('click', handleClick);
});

在这个例子中,我们在组件挂载时添加事件监听器,在卸载时移除监听器,以避免内存泄漏。

三、Vue3的事件修饰符

Vue3保留了事件修饰符的功能,可以用来简化常见的DOM事件处理需求。例如.prevent阻止默认行为,.stop阻止事件冒泡等:

<button @click.prevent="handleClick">不会提交表单的按钮</button>

四、Vue3的自定义事件

Vue3同样支持组件间的自定义事件,通过emit方法触发,并在父组件中通过v-on或@来监听:

<!-- 子组件 -->
<template><button @click="emitCustomEvent">触发自定义事件</button>
</template><script setup>
import { defineEmits } from 'vue';const emit = defineEmits(['customEvent']);function emitCustomEvent() {emit('customEvent', '自定义参数');
}
</script><!-- 父组件 -->
<template><ChildComponent @customEvent="handleCustomEvent" />
</template><script setup>
function handleCustomEvent(param) {console.log('接收到的自定义事件参数:', param);
}
</script>

总结来说,Vue3在事件监听和处理方面延续了Vue2简洁易用的特点,同时借助Composition API提供了更大的灵活性和更好的性能表现。理解并掌握这一机制,有助于我们在开发过程中更好地利用Vue3的强大功能。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"></meta><meta name="viewport" content="width=device-width,initial-scale=1.0"></meta><title>Vue3 Demo</title><style></style><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head><body><div id="Application" style="text-align: center;"><div>单击次数:{{count}}</div><!--绑定一个简单的js语句--><button @click="this.count += 1">单击</button><!--绑定一个函数--><button @click="click(2)">单击</button><button @click="click(2,$event)">单击</button><!--进行多事件处理--><button @click="click(2),log($event)">单击</button><!--Dom事件的传递原理:在页面上触发一个单击事件时,事件首先会从父组件依次传递到子组件,这个过程称为捕获过程。当事件传递到最内层的子组件时,还会逆向再进行一次传递,从子组件一次向外进行传递,这个过程称为冒泡。Vue默认监听的Dom事件的冒泡阶段,如果需要监听捕获阶段,需要使用事件修饰符capture--><div @click="click1" style="border: solid red;">外层<div @click="click2" style="border: solid red;">中层<div @click="click3" style="border: solid red;">内层  <!--点击这一层 会显示 内层 中层 外层--></div></div></div><!--监听捕获阶段--><div @click.capture="click1" style="border: solid red;">外层<div @click.capture="click2" style="border: solid red;">中层<div @click.capture="click3" style="border: solid red;">内层   <!--点击这一层 会显示 外层 中层 内层--></div></div></div><!--使用stop可以阻止事件的传递--><div @click.stop="click1" style="border: solid red;">外层<div @click.stop="click2" style="border: solid red;">中层<div @click.stop="click3" style="border: solid red;">内层   <!--点击这一层 只会显示 内层--></div></div></div><!--常用的事件修饰符stop 阻止事件传递capture 监听捕获场景的事件once 只触发一次事件self 当事件对象的target属性是当前组件时才触发事件prevent 禁止默认的事件passive 不禁止默认的事件--><div style="border: solid;" @dbclick="dbclick">双击事件</div><input @focus="focus" @blur="blur" @change="change" @select="select"></input><div style="border: solid;" @mouseover="mouseover" @mouseout="mouseout">鼠标移入移出</div><input @keydown="keydown" @keyup="keyup"></input><!--用户按下Control键的时候并且按下了鼠标按键,才会触发事件--><div @mousedown.ctrl.exact="mousedown">鼠标按下</div><!--用户按下Alt键的同时,再按回车键,才会触发事件--><input @keyup.alt.enter="keyup"></input></div><script>const App = {data() {return {count: 0}},methods: {// 系统当前的Event对象click(step,event){this.count += step},// 第一个参数可以是系统事件log(event){console.log(event)},click1(){console.log("外层")},click2(){console.log("中层")},click3(){console.log("内层")},dbclick(){console.log("双击事件") },focus(){console.log("获取焦点") },blur(){console.log("失去焦点") },change(){console.log("内容改变")  },select(){console.log("文本选中")  },mouseover(){console.log("鼠标移入")  },mouseout(){console.log("鼠标移出")},mousedown(){console.log("鼠标按下")},keydown(){console.log("鼠标按键按下")},keyup(event){console.log("鼠标按键抬起" + event.key) }},computed: {},// 监听属性watch: {}}let instance = Vue.createApp(App).mount("#Application");</script>
</body></html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/702115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot215基于springboot技术的美食烹饪互动平台的设计与实现

美食烹饪互动平台的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统美食信息管理难度大&…

MAC地址学习和老化

MAC地址学习过程 一般情况下&#xff0c;MAC地址表是设备根据收到的数据帧里的源MAC地址自动学习而建立的。 图1 MAC地址学习示意图 如图1&#xff0c;HostA向SwitchA发送数据时&#xff0c;SwitchA从数据帧中解析出源MAC地址&#xff08;即HostA的MAC地址&#xff09;和VLAN…

做接口测试的流程一般是怎么样的?UI功能6大流程、接口测试8大流程这些你真的全会了吗?

在讲接口流程测试之前&#xff0c;首先需要给大家申明下&#xff1a;接口测试对于测试人员而言&#xff0c;非常非常重要&#xff0c;懂功能测试接口测试&#xff0c;就能在企业中拿到一份非常不错的薪资。 这么重要的接口测试&#xff0c;一般也是面试笔试必问。为方便大家更…

C++ //练习 8.13 重写本节的电话号码程序,从一个命名文件而非cin读取数据。

C Primer&#xff08;第5版&#xff09; 练习 8.13 练习 8.13 重写本节的电话号码程序&#xff0c;从一个命名文件而非cin读取数据。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /***************************************…

Unity(第四部)新手组件

暴力解释就是官方给你的功能&#xff1b;作用的对象上面如&#xff1a; 创建一个球体&#xff0c;给这个球体加上重力 所有物体都是一个空物体&#xff0c;加上一些组件才形成了所需要的GameObject。 这是一个空物体&#xff0c;在Scene场景中没有任何外在表现&#xff0c;因为…

tinyxml2开源库使用

源码下载&#xff1a;GitHub - leethomason/tinyxml2: TinyXML2 is a simple, small, efficient, C XML parser that can be easily integrated into other programs. 1.加载tinyxml2库 解压上面现在的压缩包&#xff0c;将tinyxml2.h/tinyxml2.cpp添加到项目工程当中&#x…

javascript中的垃圾回收机制

一、什么是JavaScript垃圾回收机制 JavaScript中的垃圾回收机制是自动管理内存的一种机制。它负责在程序运行时识别和清除不再使用的内存&#xff0c;以便释放资源并提高性能。 JavaScript中的垃圾回收器会定期扫描内存中的对象&#xff0c;标记那些可达对象和不可达对象。 可达…

公厕智慧化_智慧化的公厕

公厕智慧化是现代城市建设中的重要一环。通过信息化、数字化和智慧化技术手段&#xff0c;实现对公共厕所的高效管理和服务&#xff0c;不仅提升了城市环境质量&#xff0c;还改善了居民生活品质。智慧公厕的智慧化包括监测、管理、服务和设备的智慧化&#xff0c;利用先进科技…

unity-unity2d基础操作笔记(二)0.5.0

unity2d基础操作笔记 五十一、canvas中的必须熟悉的属性五十二、如何调整canvas与游戏人物大小近似大小五十三、canvas中的canvas scaler介绍【概念】五十四、ui scale mode介绍【概念】五十五、为什么创建image后,canvas的范围要要远远大于游戏世界?五十六、图片常用操作【技…

1分钟带你学会Python的pass关键字和range函数

1.pass 关键字 pass关键字在 python 中没有任何实际意义&#xff0c;主要是用来完成占位的操作&#xff0c;保证语句的完整性 age int(input(请输入您的年龄&#xff1a;))if age > 18: pass # pass 在此处没有任何意义&#xff0c;只是占位 print(欢迎光临。。。…

美易官方:巴菲特发布2024年致股东公开信,重磅!

近日&#xff0c;全球投资界的巨擘巴菲特发布了2024年致股东的公开信&#xff0c;引起了广泛关注。作为伯克希尔哈撒韦公司的董事长和首席执行官&#xff0c;巴菲特的信函一直备受投资者们的期待。在这封公开信中&#xff0c;巴菲特分享了关于投资、公司治理和全球经济等方面的…

常见的排序算法整理

1.冒泡排序 1.1 冒泡排序普通版 每次冒泡过程都是从数列的第一个元素开始&#xff0c;然后依次和剩余的元素进行比较&#xff0c;若小于相邻元素&#xff0c;则交换两者位置&#xff0c;同时将较大元素作为下一个比较的基准元素&#xff0c;继续将该元素与其相邻的元素进行比…

Spring 中 ApplicationContext 和 BeanFactory 的区别有哪些

先看一张类图&#xff1a; 区别&#xff1a; 1&#xff1a;包目录不同&#xff1a; spring-beans.jar 中 org.springframework.beans.factory.BeanFactory spring-context.jar 中 org.springframework.context.ApplicationContext 2&#xff1a;国际化&#xff1a; BeanFacto…

数组详解-格式定义-遍历-求最值-遍历求和-打乱数组中的数据

数组指的是一种容器,可以用来存储同种数据类型的多个值 定义数组格式 : 完整格式-静态初始化 数据类型[]数组名new 数据类型[]{元素1,元素2,元素3...} int[] array new int[]{11,22,33}; 简化格式 int[] array {11,22,33}; 完整格式-动态初始化 初始化时只指定数组长…

mysql的日志文件在哪?

阅读本文之前请参阅----MySQL 数据库安装教程详解&#xff08;linux系统和windows系统&#xff09; MySQL的日志文件通常包括错误日志、查询日志、慢查询日志和二进制日志等。这些日志文件的位置取决于MySQL的安装和配置。以下是一些常见的日志文件位置和如何找到它们&#xff…

C++11 Thead线程库的基本使用

文章目录 创建线程传递参数等待线程完成分离线程joinable() 创建线程 要创建线程&#xff0c;我们需要一个可调用的函数或函数对象&#xff0c;作为线程的入口点。在C11中&#xff0c;我们可以使用函数指针、函数对象或lambda表达式来实现。 创建线程的基本语法如下&#xff…

PHP中的飞碟运算符、取反运算符、对比非ASCII字符串、对比浮点数操作

对比浮点数 在电脑里存储的浮点数可能会和输入的值有些许差异&#xff0c;比如输入的是10.0&#xff0c;但存储的是10.00001. 在比较两个浮点数是否相等时可以计算下两个数的差值&#xff0c;然后查看下两数之差是否小于可以接受的阈值&#xff0c;如果要求精度在小数点后5位的…

算法训练day34 Leetcode1005.K次取反后最大化的数组和● 134. 加油站 135. 分发糖果

1005 k次取反后最大化的数组和 题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回…

ubuntu 22.04LTS的一些使用心得

前言 笔者一直在折腾ubuntu作为开发的主力系统&#xff0c;尤其是最近微信和各种软件陆续支持Debian系列&#xff0c;很多软件都可以用了&#xff0c;当然开源的软件大部分是跨平台的&#xff0c;尤其是idea系列。 X11 OR Wayland 关于X11和wayland&#xff0c;笔者还是使用…

9.5K Star,又一款超棒开源轻量自动化运维平台

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 一个好的运维平台就变得非常重要了&#xff0c;可以节省大量的人力和物…