[JavaScript] 事件委托以及 Vue 列表循环事件绑定的性能优化

news/2024/9/19 14:12:43/文章来源:https://www.cnblogs.com/Himmelbleu/p/18407806

前言

事件委托(Event Delegation) 是一种通过将事件监听器绑定到父元素,而不是直接绑定到每个子元素上的技术。这样可以减少事件监听器的数量,提升性能,并使得对动态添加或移除的元素更容易进行事件处理。

事件冒泡和事件捕获

事件冒泡:从里往外

<div id="parent" style="padding: 50px; background-color: lightblue">Parent Div<button id="child" style="padding: 20px">Child Button</button>
</div><script>const parentDiv = document.getElementById("parent");const childButton = document.getElementById("child");parentDiv.addEventListener("click",event => {console.log("Parent Div Clicked (Capturing)");});childButton.addEventListener("click", () => {console.log("Button Clicked");});
</script>

事件冒泡:从里往外

事件捕获:从外往里

const parentDiv = document.getElementById("parent");
const childButton = document.getElementById("child");parentDiv.addEventListener("click",event => {console.log("Parent Div Clicked (Capturing)");},true
); // 捕获阶段处理childButton.addEventListener("click", () => {console.log("Button Clicked");
});

事件捕获:从外往里

事件委托

事件委托主要是依赖于事件冒泡(事件从最深层的子元素冒泡到父元素)。通过将事件监听器绑定到父元素,当子元素触发事件时,事件会冒泡到父元素并在父元素上捕捉到事件。我们可以通过 event.target 来判断事件最初是由哪个子元素触发的。

事件监听器绑定到 li 的父元素 ul 身上,点击其子元素 li,就可以触发点击事件。点击子元素会依次往上冒泡,直到 ul 的事件监听器捕获到点击事件。

<button id="btn">点击新增标签项</button>
<ul id="ul"><li>标签项</li><li>标签项</li><li>标签项</li>
</ul><script>const btn = document.querySelector("btn");const ul = document.querySelector("#ul");ul.addEventListener("click", function (e) {console.log(e.target);});
</script>

Vue 列表循环性能优化

当初通过 B站 网上视频学习 Vue,对于这类需求视频中直接把事件绑定给 li,直到了解到事件委托和事件冒泡,才知道这样做对性能有很大影响。

v-for 循环中将索引 index 绑定到 <li> 元素的 data- 属性中,然后在事件委托的处理函数中通过 event.target 获取它。

<template><ul @click="handleClick"><li v-for="(item, index) in items" :key="index" :data-index="index">{{ item }}</li></ul>
</template><script>
export default {data() {return {items: ['Item 1', 'Item 2', 'Item 3'],};},methods: {handleClick(event) {// 判断点击的目标是否为 <li> 元素if (event.target.tagName === 'LI') {// 通过自定义属性 data-index 获取对应的索引const index = event.target.dataset.index;console.log('Clicked item index:', index);console.log('Clicked item value:', this.items[index]);}}}
}
</script>

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

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

相关文章

GT收发器

1.GT触发器的IP使用 第一页 第二页 第三页 GTP IP 提供了两种解决跨时钟域的方法:(1)RX Elastic Buffer(RX 弹性缓冲器);(2)RX Phase Alignment(RX 相位对齐电路),两种方法的比较:RXElastic Buffer优点在于稳定,易使用, 执行相位校准的速度快,但是需要时钟和通道进…

Qt 中实现异步散列器

在很多工作中,我们需要计算数据或者文件的散列值,例如登录或下载文件。 而在 Qt 中,负责这项工作的类为 `QCryptographicHash`。 虽然 `QCryptographicHash `很优秀,但它最大的问题在于其散列值的计算是同步的( 即阻塞 ),对小数据来说并没什么影响,但对大数据来说则意味明…

新建工程——STM32学习笔记2

目录新建工程 添加启动程序Start 添加内核程序Core相关资料下载 下载链接(来自B站江协科技) 通过百度网盘分享的文件:STM32入门教程资料 链接:https://pan.baidu.com/s/17_sbwMXU-xBVFA2sK0smrg?pwd=cgn6 提取码:cgn6STM32开发方式有3种,分别是基于寄存器开发、基于标准…

Java八股复习指南-集合

Java集合 Map HashMap 实现原理/底层 Java1.8之前:数组加链表 Java1.8之后:当一个链表的长度超过8,且数组大小超过64时,会将链表转换成红黑树存储,查找效率更高,时间复杂度O(log n)。如果长度超过8,但是数组容量不足64,则会选择扩容数组。 定位算法 计算key的哈希值,并…

幂函数与指数函数区别

本文来自博客园,作者:cytlz2730,转载请注明原文链接:https://www.cnblogs.com/cytwjyy/p/18407701

zabbix“专家坐诊”第255期问答

问题一 Q:大家好,问一下,zabbix做聚合图的时候,可以做到两根线在一个图里- 吗?还是说只能,单边计算聚合,然后再最后作图的时候,添加两条线上去A:两个数据吗 Q:是的。一个端口,有进有出 A:如果是两个监控项可以做到聚和一起问题二 Q:请问大佬们,这个加密是干嘛的?…

项目管理方法,方法和框架–初学者指南

项目可以通过各种方式成功结束。但是,最好,最受欢迎的项目管理方法,方法和框架总是在变化。新概念无时无刻不在出现。所有成功的项目都包含一整套方法,工具和技术。实际上,作为项目管理从业人员,您一生中可能会使用其中的一种以上。 但是,项目管理方法论,方法和框架不仅…

Nodejs-child_process模块解读

在 Node.js 应用程序中,child 进程模块非常重要,有了它可以实现并行处理,这在资源密集型在 Node.js 应用程序中,child 进程模块非常重要,有了它可以实现并行处理,这在资源密集型任务里十分重要。 在本文中,我们将看一下 child 进程模块,解释其目的、使用方式以及如何使…

HPC环境下数据下载:安全与效率的完美平衡!

在能源行业,高性能计算(HPC)应用广泛,比如地震数据处理、油气藏模拟和建模、地理空间分析、风模拟和地形映射等。随着数据量的爆发式增长,HPC环境下数据下载面临着严峻的安全挑战,如何在保障数据高效流转的同时,确保数据安全,成为能源企业必须面对的重要课题。 高性能…

【干货分享】Ftrans安全数据交换系统 搭建跨网数据传输通道

安全数据交换系统是一种专门设计用于在不同的网络、系统或组织之间安全地传输数据的软件或硬件解决方案。这种系统通常包含多种安全特性,以确保数据在传输过程中的保密性、完整性和可用性。 安全数据交换系统可以解决哪些问题? 安全数据交换系统主要解决以下问题: 数据泄露风…

采集DNP3设备数据 转 IEC61850项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 配置网关采集DNP3协议数据 2 5 用IEC61850协议转发数据 4 6 网关使用多个逻辑设备和逻辑节点的方法 6 7 案例总结 7 1 案例说明设置网关采集DNP3协议设备数据 把采集的数据转成IEC61850协议转发给其他系统。2 VFBOX网关…