React合成事件及其核心思想详解

news/2024/11/19 6:29:50/

相关联Javascript知识

1.JavaScript 的事件流

   事件流是 JavaScript 处理事件的机制,它描述了事件从发生到被处理的过程。事件流主要包括两个阶段:捕获阶段和冒泡阶段。在捕获阶段,事件从文档的根元素开始,逐层向下传播到目标元素,这个阶段可以阻止事件到达目标元素。在冒泡阶段,事件从目标元素开始,逐层向上传播到文档的根元素,这个阶段可以对事件进行响应。事件流的顺序是:捕获处理程序 → 目标处理程序 → 冒泡处理程序。

2.JavaScript 事件冒泡和捕获的区别是什么?默认是冒泡还是捕获?
  • 区别:

     事件冒泡:事件从目标元素开始,逐层向上传播到祖先元素,直到文档的根元素(在浏览器中通常是 document 对象)。
     事件捕获:事件从文档的根元素开始,逐层向下传播到目标元素。

  • 默认行为:

在 JavaScript 中,事件默认是按照冒泡阶段进行传播的。但是,可以通过在事件监听器中使用 capture 选项或 addEventListener 方法第三个参数来指定事件在捕获阶段进行传播。

3.什么是 JavaScript 的事件代理?

      事件代理(Event Delegation)是一种常用的技术,它利用事件冒泡的原理,将事件监听器添加到父元素上,而不是直接添加到目标元素上。当目标元素触发事件时,事件会冒泡到父元素,父元素上的事件监听器可以捕获并处理该事件。这种方法可以减少事件监听器的数量,提高性能,并且便于管理事件监听器。

1. 什么是合成事件?

React 的合成事件 (SyntheticEvent) 是对原生 DOM 事件的封装,它在所有浏览器中表现一致,用于解决跨浏览器的兼容性问题。它是 React 自身实现的一个轻量级事件系统。

2. 核心思想

React 合成事件的核心思想主要包括以下几个方面:

a. 跨浏览器的兼容性

合成事件对原生事件进行了统一封装,屏蔽了不同浏览器之间的行为差异。开发者可以直接使用 React 提供的合成事件,而无需考虑浏览器特性。

b. 事件委托 (Event Delegation)

React 并不将事件处理程序绑定到每个具体的 DOM 节点,而是利用事件委托的机制,将所有事件统一绑定到根节点上(如 documentcontainer)。当事件发生时,React 会根据事件对象的 target 属性找到对应的组件进行处理。

优点:

  • 减少了事件绑定的数量,提升了性能,尤其是在大量动态 DOM 节点的场景中。
  • 易于统一管理和清理事件监听器
c. 事件池 (Event Pool)

为了提高性能,React 会对事件对象进行对象池化处理。合成事件对象会被重用,事件处理结束后,合成事件的所有属性都会被清空。

function handleClick(event) {console.log(event.type); // 可以正常访问setTimeout(() => {console.log(event.type); // 此时访问将为空,因为事件对象已被复用}, 0);
}

如果需要异步访问事件对象,可以通过 event.persist() 方法保留事件。

function handleClick(event) {event.persist();setTimeout(() => {console.log(event.type); // 异步访问仍然可用}, 0);
}
3. 合成事件与原生事件的对比
特性React 合成事件原生 JavaScript 事件
兼容性跨浏览器统一表现需要处理浏览器差异
事件绑定事件委托到根节点直接绑定到具体 DOM 节点
性能减少事件监听器数量每个绑定的 DOM 节点都有独立监听器
API统一接口(如 onClick, onChange浏览器原生 API
事件复用事件池机制,需调用 persist()不存在复用机制

4. 常见的合成事件

React 提供了一组封装的合成事件,常见事件包括:

  • 鼠标事件: onClick, onDoubleClick, onMouseEnter, onMouseLeave
  • 键盘事件: onKeyDown, onKeyPress, onKeyUp
  • 表单事件: onChange, onInput, onSubmit
  • 焦点事件: onFocus, onBlur
  • 触摸事件: onTouchStart, onTouchMove, onTouchEnd
  • 其他: onScroll, onWheel, onDrag, onDrop
5. 示例代码
import React from "react";function App() {const handleClick = (event) => {console.log("Button clicked!");console.log("Event type:", event.type);event.persist(); // 保留事件setTimeout(() => {console.log("Event type after timeout:", event.type); // 仍可访问}, 1000);};return <button onClick={handleClick}>Click Me</button>;
}export default App;
6. 为什么合成事件更高效?
  1. 事件委托减少了大量的事件监听器开销。
  2. 对象池机制复用事件对象,避免频繁创建和销毁,提高了内存使用效率。
  3. 批量更新:合成事件结合 React 的更新机制(如事务机制、批处理),可以避免不必要的多次重绘。
7. 原生事件与合成事件的混用

在某些情况下,可能需要使用原生事件(如性能优化、与第三方库兼容)。React 合成事件和原生事件可以共存,但需注意它们是独立的事件系统。

function App() {React.useEffect(() => {const handleNativeClick = () => console.log("Native click");document.getElementById("btn").addEventListener("click", handleNativeClick);return () => {document.getElementById("btn").removeEventListener("click", handleNativeClick);};}, []);return <button id="btn">Click Me</button>;
}
总结

React 的合成事件通过事件委托和事件池机制,在保证跨浏览器一致性的同时,优化了性能。虽然它与原生事件有区别,但它简化了开发流程,是 React 框架设计的重要组成部分。

------------------------------------------------------------------------------------------------------------------------------

callBack

React合成事件是React模拟原生DOM事件所有能力的一个事件对象,它是React中较为重要的概念。以下是对React合成事件的详细解析:

一、合成事件的概念

React合成事件(SyntheticEvent)是React根据W3C规范定义的事件,它兼容所有浏览器,并提供了与浏览器原生事件相同的接口。在React中,所有事件都是合成的,而不是原生DOM事件。但可以通过e.nativeEvent属性获取原生DOM事件。

二、合成事件的作用

  1. 浏览器兼容:React提供的合成事件用来抹平不同浏览器事件对象之间的差异,将不同平台事件模拟成合成事件。
  2. 性能优化:React采用顶层事件代理机制,将所有事件绑定在document上,通过dispatchEvent来分发事件。这种处理减少了事件注册的次数,并提高了性能。同时,React还引入了事件池来复用事件对象,避免频繁地创建和销毁事件对象(垃圾回收)。
  3. 统一事件管理:合成事件使得React能够统一管理和处理事件,简化了事件处理的逻辑。

三、合成事件与原生事件的区别

  1. 命名方式

    • 原生事件:命名为纯小写,如onclickonblur等。
    • React事件:命名采用小驼峰式(camelCase),如onClickonBlur等。
  2. 事件处理函数写法

    • 原生事件:事件处理函数为字符串。
    • React事件:在JSX语法中,传入一个函数作为事件处理函数。
  3. 阻止默认行为

    • 原生事件:可以通过返回false方式来阻止默认行为。
    • React事件:需要显式使用preventDefault()方法来阻止默认行为。
  4. 事件传播

    • 原生事件:执行需要经过三个阶段:捕获阶段、目标元素阶段、冒泡阶段。节点上的原生事件的执行是在目标阶段。
    • 合成事件:执行是在冒泡阶段。所以原生事件会先合成事件执行,然后再往父节点冒泡。原生事件阻止冒泡会阻止合成事件的触发,而合成事件的阻止冒泡不会影响原生事件。

四、合成事件的使用

在React中,可以使用onEventName属性为元素添加事件侦听器,其中eventName是要侦听的事件的名称(例如onClickonMouseMove)。事件侦听器函数将接收一个合成事件对象作为参数。

jsx复制代码

function handleClick(event) {
console.log('Button was clicked!');
}
return <button onClick={handleClick}>Click me</button>;

合成事件对象提供了多个有用的属性,如type(事件类型)、target(触发事件的DOM元素)、currentTarget(正在处理事件的DOM元素,通常与target相同,但对于冒泡事件则不同)等。此外,还包含了阻止默认行为的方法,例如preventDefault()stopPropagation()

五、合成事件的常见问题

  1. 事件池:React使用事件池来复用事件对象。当事件触发时,React会从事件池中获取一个事件对象,并在事件处理完成后将其释放回事件池。这避免了频繁地创建和销毁事件对象,提高了性能。
  2. 事件委托:React采用事件委托的方式来处理事件。它将事件侦听器附加到父元素上,而不是为每个子元素附加单独的侦听器。这可以提高性能,特别是对于具有大量子元素的列表或网格。
  3. 阻止事件冒泡:在React中,可以使用stopPropagation()方法来阻止事件冒泡。但需要注意的是,阻止合成事件的冒泡不会影响原生事件的传播。
  4. 异步操作中的事件对象:由于合成事件对象在事件处理函数调用后被回收,因此应避免在异步操作中访问这些对象。如果需要在异步操作中使用事件对象的信息,应该在事件处理函数内部将其保存到另一个变量中。

六、最佳实践

  1. 使用箭头函数作为事件处理程序:这有助于绑定事件处理程序函数中的this上下文。但需要注意的是,使用箭头函数会在每次渲染时创建一个新的函数实例,这可能会影响性能。在性能敏感的场合,可以考虑使用其他方法来绑定this上下文。
  2. 使用事件委派来提高性能:对于具有大量子元素的列表或网格,将事件侦听器附加到父元素上可以提高性能。
  3. 小心使用preventDefault()stopPropagation():仅在绝对必要时使用这些方法,因为它们可以中断默认浏览器行为并影响事件传播。

综上所述,React合成事件是React中处理事件的一种重要机制。它提供了跨浏览器兼容性、性能优化和统一事件管理等优点。在使用合成事件时,需要遵循最佳实践并注意常见问题以确保代码的正确性和性能。

 


http://www.ppmy.cn/news/1548169.html

相关文章

从零开始学习 sg200x 多核开发之 milkv-duo256 编译运行 sophpi

sophpi 是 算能官方针对 sg200x 系列的 SDK 仓库 https://github.com/sophgo/sophpi &#xff0c;支持 cv180x、cv81x、sg200x 系列的芯片。 SG2002 简介 SG2002 是面向边缘智能监控 IP 摄像机、智能猫眼门锁、可视门铃、居家智能等多项产品领域而推出的高性能、低功耗芯片&a…

C++:哈希拓展-位图

目录 一.问题导入 二.什么是位图? 2.1如何确定目标数在哪个比特位? 2.2如何存放高低位 2.3位图模拟代码实现 2.3.1如何标记一个数 2.3.2如何重置标记 2.3.3如何检查一个数是否被标记 整体代码实现 标准库的Bitset 库中的bitset的缺陷 简单应用 一.问题导入 这道…

【算法】【优选算法】前缀和(下)

目录 一、560.和为K的⼦数组1.1 前缀和1.2 暴力枚举 二、974.和可被K整除的⼦数组2.1 前缀和2.2 暴力枚举 三、525.连续数组3.1 前缀和3.2 暴力枚举 四、1314.矩阵区域和4.1 前缀和4.2 暴力枚举 一、560.和为K的⼦数组 题目链接&#xff1a;560.和为K的⼦数组 题目描述&#x…

手机发展史介绍

手机&#xff0c;这个曾经在电影和科幻小说中出现的高科技产品&#xff0c;如今已经渗透进了我们生活的每个角落。从单纯的通讯工具到如今集成了通讯、娱乐、工作、社交等多种功能的智能终端&#xff0c;手机的发展史也是人类科技进步的缩影。本文将从手机的发展历程、技术革新…

如何通过低代码逻辑编排实现业务流程自动化?

随着数字化转型的加速&#xff0c;企业对高效、灵活的业务流程自动化需求日益增加。传统开发模式下的定制化解决方案往往周期长、成本高且难以适应快速变化的需求。低代码平台以其直观、简便的操作界面和强大的功能逐渐成为企业实现业务流程自动化的理想选择。本文将探讨低代码…

MySQL的编程语言

一、MySQL基础 使用系统的全局变量@@VERSION查看当前使用的MySQL的版本信息,SQL语句如下: select @@version; 将局部变量varl声明为char的类型,长度值为10,并为其赋值为“程菲” begin declare var1 char(10); set @var1="程菲"; end 通过局部变量查看d_eams数…

视频智能分析软件LiteAIServer视频智能分析平台玩手机打电话检测算法

在当今这个数字化时代&#xff0c;智能手机已成为我们日常生活中不可或缺的一部分&#xff0c;它极大地便利了我们的沟通与学习。然而&#xff0c;当这份便利被不恰当地带入到如工厂生产线、仓库以及学校课堂等特定的工作和学习环境中时&#xff0c;其潜在的危害便逐渐显露出来…

无人机在森林中的应用!

一、森林资源调查 无人机可以利用遥感技术快速获取所需区域高精度的空间遥感信息&#xff0c;对森林图斑进行精确区划。相较于传统手段&#xff0c;无人机调查具有低成本、高效率、高时效的特点&#xff0c;尤其在地理环境条件不好的区域&#xff0c;调查人员无法或难以到达的…