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

在 VueJS 中使用事件委托处理点击事件(事件委托,vue事件委托,什么是事件委托,什么是vue的事件委托)

前言

在开发 Vue 项目时,我们经常需要处理大量的点击事件。为每个可点击的元素单独添加事件监听器不仅会增加代码的复杂度,还会降低性能。事件委托是一种有效的优化方式,它可以显著减少事件监听器的数量,提高代码的可维护性和执行效率。我们通过一个实际示例,详细讲解如何在 Vue 项目中使用事件委托。简单记录一下


一. 事件委托定义

VueJS中的事件委托是一种优化事件处理和提升性能的技术,它允许你在一个父元素上监听事件,而不是在每个子元素上单独绑定事件处理器。这种做法基于JavaScript 的事件冒泡机制,即在DOM树中,事件会从最深层的节点开始向上冒泡,直到到达document根节点。


二. HTML 内容结构

1. 首先,看下 HTML 部分:

    <div class="homeView_box"><div class="iconInside_box" @click="choseIconInside"><img src="@/assets/sxzy/1.png" class="cmCt img1" data-action="moveUp" /><imgsrc="@/assets/sxzy/2.png"class="cmCt img2"data-action="moveDown"/><imgsrc="@/assets/icons/home3.png"class="cmCt img3"data-action="mainView"@click="choseHomeIcon"/><imgsrc="@/assets/sxzy/3.png"class="cmCt img4"data-action="moveLeft"/><imgsrc="@/assets/sxzy/4.png"class="cmCt img5"data-action="moveRight"/></div></div>

2. 以上部分代码,我们写了一个父级 div 容器 .iconInside_box,其中包含5个 img 元素,每个 img 元素代表一个可点击的图标。其中:

  1. @click=“choseIconInside”,在父级容器上绑定点击事件监听器。
  2. data-action,每个 img 元素都有一个data-action 属性,用于标识点击时要执行的动作。


三. 事件逻辑函数

1. 事件触发时,事件委托的处理函数;这里我们有一个包含多个图标的 div 容器,每个HTML元素图标,有不同的点击操作,请看以下:

    choseIconInside(e) {const action = e.target.getAttribute("data-action");if (action) {switch (action) {case "moveUp":console.log("向上移动");// 实现向上移动的逻辑this.viewer.camera.moveUp(10);break;case "moveDown":console.log("向下移动");// 实现向下移动的逻辑this.viewer.camera.moveDown(10);break;case "moveLeft":console.log("向左移动");// 实现向左移动的逻辑this.viewer.camera.moveLeft(10);break;case "moveRight":console.log("向右移动");// 实现向右移动的逻辑this.viewer.camera.moveRight(10);break;case "mainView":console.log("主视角图");let _this = this;this.viewer.camera.flyTo({destination: this.Cesium.Cartesian3.fromDegrees(118.879624,32.036791,10),orientation: {// 设置相机的默认方向(heading),此处为朝向东南方向heading: this.Cesium.Math.toRadians(238),// 设置相机的俯仰角(pitch),此处为略微向下看pitch: this.Cesium.Math.toRadians(-15),// 设置相机的滚转角(roll),此处为不滚转roll: 0.0,},duration: 2,complete: function () {_this.viewer.camera.zoomOut(200); // 在飞行动画完成后缩小场景},});break;default:console.log("未知动作");}}},},

2. 以上代码我们展示了一个事件处理器函数 choseIconInside,它用于响应用户在界面中对某些图标或按钮的点击操作。该函数主要实现了以下功能:

1. 读取data-action属性:

  • 当事件触发时,函数通过事件对象 e.target 获取被点击元素上的 data-action 属性值。这个属性是用来区分不同图标或按钮的功能的。


2. 根据data-action执行不同操作:

  • 使用 switch 语句根据 data-action 的值执行相应的逻辑。
  • "moveUp" 和 "moveDown":控制相机沿垂直轴向上或向下移动。
  • "moveLeft" 和 "moveRight":控制相机沿水平轴向左或向右移动。
  • "mainView":将相机飞往预设的位置,并设置相机的方向和角度,最后在动画完成后再执行缩放操作。


3. Cesium相关操作:

  • this.viewer.camera 是用来控制3D场景中相机行为的对象。
  • moveUp, moveDown, moveLeft, 和 moveRight 方法用于即时地改变相机位置。
  • flyTo 方法则用于创建一个平滑的相机飞行动画到指定的地理坐标,同时可以设定飞行结束后的回调函数。


4. 错误处理:

  • 如果 data-action 的值不是预期的任何一种情况,代码将输出一条“未知动作”的日志信息。

3. choseIconInside 函数是一个用于处理用户交互的事件处理器,它根据被点击元素的 data-action 属性值执行特定的相机控制操作,从而实现对3D场景的导航和视角调整。这种设计模式使得代码更加模块化和可维护,同时也提高了用户界面的响应性和交互性。

4. 这里的switch语句是一种选择结构,它允许程序基于不同的条件来执行不同的代码块。switch语句通常用来替代多个if...else if...else语句,当有大量条件需要检查时,使用switch可以使代码更清晰、更简洁。


四. 事件委托的优势

  1. 减少事件监听器数量:通过在父元素上绑定事件监听器,避免了在每个子元素上分别绑定监听器,减少了内存消耗和提高了性能。

  2. 动态添加元素:如果页面中需要动态添加新的子元素,事件委托可以确保新元素也能自动获得事件处理能力,而无需重新绑定事件。

  3. 简化代码:使用事件委托可以使你的代码更加简洁和易于维护,尤其是当有大量相似类型的元素需要处理相同类型的事件时。


五. 注意事项

  1. 事件目标判断:在事件处理函数中,你需要确保检查e.target(事件的目标元素)是否是你想要处理的元素。这是因为事件冒泡也可能触发父元素上绑定的事件,即使点击的是父元素内部的其他非目标元素。

  2. 事件阻止:有时你可能需要阻止事件的进一步传播,例如使用e.stopPropagation()。这样可以防止事件冒泡到更高级别的元素,避免触发不必要的事件处理。

  3. e.stopPropagation() 是一个在JavaScript中用于阻止事件冒泡的方法。当你在DOM树中的某个元素上触发一个事件(比如点击事件),这个事件会首先在目标元素上触发,然后沿着DOM树向上冒泡,依次触发其祖先元素上的事件监听器。如果你不希望事件继续向上冒泡并触发更多的事件处理器,可以调用 e.stopPropagation()

  4. 调用 stopPropagation() 方法后,事件将不会继续在其祖先元素上调用任何事件处理器。这在处理复杂的DOM结构时非常有用,可以防止意外触发不需要的事件处理器,从而避免潜在的性能问题或逻辑错误。

  5. 性能考量:虽然事件委托可以提高性能,但过多的事件监听器仍然可能影响性能。合理规划事件监听器的布局和层级可以进一步优化应用的响应速度。


六. 本章小结

事件委托是一种高效且优雅的事件处理方式,尤其适用于处理大量相似子元素的事件。在Vue.js项目中运用事件委托,可以极大地提升代码的可读性和性能表现。

创作不易,感觉有用,就一键三连,感谢(●'◡'●)

相关文章:

在 VueJS 中使用事件委托处理点击事件(事件委托,vue事件委托,什么是事件委托,什么是vue的事件委托)

前言 在开发 Vue 项目时&#xff0c;我们经常需要处理大量的点击事件。为每个可点击的元素单独添加事件监听器不仅会增加代码的复杂度&#xff0c;还会降低性能。事件委托是一种有效的优化方式&#xff0c;它可以显著减少事件监听器的数量&#xff0c;提高代码的可维护性和执行…...

密码学简史:时间密语

​ 注&#xff1a;机翻&#xff0c;未校。 A brief history of cryptography: Sending secret messages throughout time Stemming from the Greek words for “hidden writing,” cryptography is the practice of encrypting transmitted information so that it can only b…...

【Java数据结构】---初始数据结构

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 前言 从今天开始我们就要学习Java…...

MySQL--主从复制

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、什么是主从复制 1、定义 主从复制&#xff0c;是用来建立一个和主数据库完全一样的数据库环境&#xff0c;称为从数据库&#xff1b;主数据库一…...

Linux RT调度器之负载均衡

RT调度类的调度策略是&#xff1a;保证TopN&#xff08;N为系统cpu个数&#xff09;优先级的任务可以优先获得cpu资源。除了在任务选核时通过基于cpu优先级的选核策略保证这一点外&#xff0c;还有其它流程&#xff0c;我们姑且将这部分流程称作RT调度器的负载均衡&#xff08;…...

pwn学习笔记(8)--初识Pwn沙箱

初识Pwn沙箱 ​ 沙箱机制&#xff0c;英文sandbox&#xff0c;是计算机领域的虚拟技术&#xff0c;常见于安全方向。一般说来&#xff0c;我们会将不受信任的软件放在沙箱中运行&#xff0c;一旦该软件有恶意行为&#xff0c;则禁止该程序的进一步运行&#xff0c;不会对真实系…...

Day18_2--Vue.js Ajax(使用 Axios)基础入门学习

Vue.js 中的 Ajax 请求&#xff08;使用 Axios&#xff09; 什么是 Axios&#xff1f; Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;可以用于浏览器和 Node.js 环境中。它是现代化的 Ajax 库&#xff0c;用来替代传统的 XMLHttpRequest。 为什么选择 Axios&#xf…...

windows11远程桌面如何打开

随着远程办公的普及&#xff0c;选择合适的远程桌面工具变得尤为重要。在Windows 11上&#xff0c;用户可以利用系统自带的远程桌面功能&#xff0c;或选择更专业的第三方解决方案&#xff0c;如Splashtop。本文将详细介绍如何在Windows 11上启用远程桌面&#xff0c;并对比Win…...

qt代码显示,包含文本颜色设置等

QScintilla 安装示例代码参考链接 安装 最近发现了一个有趣的库&#xff0c;qt的插件库&#xff0c;之前一直以为显示代码时是重写QTextEdit来实现的&#xff0c;结果qt有现成的一个库来显示这些东西&#xff0c;在此记录一下 # 安装 QScintilla pip install QScintilla示例代码…...

抽象代数精解【6】

文章目录 简单密码算法模运算数学定义置换移位代换仿射 参考文献 简单密码算法 模运算数学定义 模m剩余类集 Z m Z_m Zm​ 设∀a,b∈Z&#xff08;整数&#xff09;&#xff0c;m为正整数 m|b-a &#xff0c;称a R b R满足反身性、对称性、传递性 1、R为同余关系&#xff0c;…...

如何选择合适的PCB材料?FR4、陶瓷、还是金属基板?

选择合适的PCB材料对于电路板的性能、可靠性和成本至关重要。不同的PCB材料具有不同的特性&#xff0c;适用于不同的应用场景。 01 FR4&#xff08;玻璃纤维环氧树脂&#xff09; FR4的特点&#xff1a; 广泛应用&#xff1a;FR4是最常见的PCB基板材料&#xff0c;广泛应用…...

PXE学习及其简单应用

一、PXE 的定义 PXE 是一种基于网络的启动技术&#xff0c;最初由 Intel 开发&#xff0c;旨在提供一种在没有本地存储设备的情况下通过网络启动操作系统的标准。PXE 集成在计算机的 BIOS 或 UEFI 中&#xff0c;允许计算机从网络服务器下载并启动操作系统或其他软件。 二、PX…...

【Python】把list转换成json文件(list中为字典,元素按行写入)

0.前言 数据需要处理成与大模型输入相同类型的数据&#xff0c;从csv文件读出后&#xff0c;想要转换成json文件&#xff0c;看了好多资料都是把整个list写入了json&#xff0c;并不是我想要的格式&#xff0c;这里记录一下最后的按行写入的格式。 1.list转json import json …...

《机器人SLAM导航核心技术与实战》第1季:第8章_激光SLAM系统

视频讲解 【第1季】8.第8章_激光SLAM系统-视频讲解【第1季】8.1.第8章_激光SLAM系统_Gmapping算法-视频讲解【第1季】8.2.第8章_激光SLAM系统_Cartographer算法-视频讲解【第1季】8.3.第8章_激光SLAM系统_LOAM算法-视频讲解 第1季&#xff1a;第8章_激光SLAM系统 先 导 课第…...

【安当产品应用案例100集】005-安当ASP实现Exchange双因素登录认证

Exchange双因素登录通过增加额外的安全验证层&#xff0c;可以有效提高企业邮箱系统的安全性&#xff0c;减少了数据泄露和账号被盗的风险&#xff0c;同时也符合了日益严格的安全合规要求。 其必要性主要体现在以下几个方面&#xff1a; 提高安全性&#xff1a;传统的用户名…...

【Bug】Pytorch RuntimeError: DataLoader worker (pid(s) 15904) exited unexpectedly

【Bug1】RuntimeError: DataLoader worker (pid(s) 15904) exited unexpectedly 知乎&#xff1a;https://zhuanlan.zhihu.com/p/712407893 环境 Windows 11 Python 3.10 torch 2.0.1 numpy 1.25.0问题详情 在使用 PyTorch 的 DataLoader 时出现的错误。详情 RuntimeError:A…...

谈谈冯诺依曼体系

我们都知道冯诺依曼体系这张图最为代表性&#xff0c;而接下来我们就来浅谈一下各部分之间的作用~ 输入设备&#xff1a;键盘&#xff0c;磁盘&#xff0c;网卡&#xff0c;话筒等等 输出设备&#xff1a;磁盘&#xff0c;网卡&#xff0c;声卡&#xff0c;显示屏等等 这些硬件…...

第十二章 元数据管理10分

12.1 引言 如果没有元数据&#xff0c;组织可能根本无法管理其数据。 ISO/IEC11179 元数据注册标准。 元数据管理原则&#xff1a;应归尽归&#xff0c;应收尽收。衡量标准&#xff1a;目录是否完整。&#xff08;去第十二章 元数据管理&#xff09;。 主数据管理&#xff1a;主…...

eco_tracker

特征 VGG是第一个提出使用块的想法&#xff0c;通过使用循环和子程序&#xff0c;可以很容易地在任何现代深度学习框架的代码中实现这些重复的架构。 原始VGG网络有5个卷积块&#xff0c;其中前两个块各有一个卷积层&#xff0c;后三个块各包含两个卷积层。 第一个模块有64个…...

electron 鼠标事件

版本&#xff1a;"electron": "^22.3.27"&#xff0c;实现一个在windows下图片点击右键&#xff0c;使用electron打开的功能。 一、注册表操作 注册表工具类 const cp require("child_process"); const { app } require(electron/remote) e…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

前端工具库lodash与lodash-es区别详解

lodash 和 lodash-es 是同一工具库的两个不同版本&#xff0c;核心功能完全一致&#xff0c;主要区别在于模块化格式和优化方式&#xff0c;适合不同的开发环境。以下是详细对比&#xff1a; 1. 模块化格式 lodash 使用 CommonJS 模块格式&#xff08;require/module.exports&a…...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析

目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork&#xff08;创建个人副本&#xff09;步骤 2: Clone&#xff08;克隆…...