当前位置:首页 > 科技  > 软件

React 合成事件和 JavaScript 事件有什么区别?

来源: 责编: 时间:2024-05-07 09:11:00 87观看
导读五一前帮一个同学做模拟面试的时候,聊到了 React 的合成事件和 JavaScript 原生事件的差异性问题。我发现很多 React 技术栈的同学对这一方面好像理解的并不清楚,所以今天咱们这篇文章主要就来说下这个问题。1.设计理念

五一前帮一个同学做模拟面试的时候,聊到了 React 的合成事件和 JavaScript 原生事件的差异性问题。我发现很多 React 技术栈的同学对这一方面好像理解的并不清楚,所以今天咱们这篇文章主要就来说下这个问题。wpl28资讯网——每日最新资讯28at.com

wpl28资讯网——每日最新资讯28at.com

1.设计理念

React合成事件 封装 了原生浏览器事件,提供了统一的API接口,使得开发者无论浏览器环境如何都可以用相同的方式处理事件。这种方法的主要目的是:确保跨浏览器的一致性并与 React 的声明式编程模型和生命周期集成。wpl28资讯网——每日最新资讯28at.com

JavaScript 中的事件处理程序 由浏览器直接提供,与特定的浏览器行为密切相关。不同的浏览器可能有不同的实现和支持级别。wpl28资讯网——每日最新资讯28at.com

2.浏览器兼容性

React 合成事件处理所有浏览器兼容性问题,为开发人员提供一个干净、一致的事件处理接口。wpl28资讯网——每日最新资讯28at.com

例如:它标准化了不同浏览器之间的事件行为,以事件冒泡和默认行为为例,咱们来看下它的实现:wpl28资讯网——每日最新资讯28at.com

// 构造器定义,接收事件配置、目标实例、本地事件和事件目标作为参数function SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) {  this.dispatchConfig = dispatchConfig; // 存储事件的配置信息,例如事件类型  this._targetInst = targetInst; //存储触发事件的组件实例  this.nativeEvent = nativeEvent; // 存储本机浏览器事件对象  this.target = nativeEventTarget; // 存储事件的原生目标,即事件最初发生的多姆元素  this.currentTarget = null; // 处理事件的当前多姆元素将在事件处理期间设置}// SyneticEvents的原型对象,定义所有实例共享的方法SyntheticEvent.prototype = {  // Method to prevent the default event behavior  preventDefault: function() {    this.defaultPrevented = true; // 标志着事件的默认行为已被阻止    const event = this.nativeEvent; // 获取本地事件对象    if (!event) {      return; // 如果没有本地事件对象,则直接返回    }    // 如果本机事件对象支持preventAlert方法,请调用它以防止默认行为    if (event.preventDefault) {      event.preventDefault();    } else if (typeof event.returnValue !== 'undefined') { // 与IE8及以下版本兼容      event.returnValue = false; // 在较旧的IE浏览器中,使用returnValue= true来防止默认行为    }  },    // 阻止事件进一步传播的方法  stopPropagation: function() {    const event = this.nativeEvent; // 获取本地事件对象    if (!event) {      return; // 如果没有本地事件对象,则直接返回    }    // 如果本机事件对象支持stopPropagation方法,请调用它来停止事件冒泡    if (event.stopPropagation) {      event.stopPropagation();    } else if (typeof event.cancelBubble !== 'undefined') { // 与IE8及以下版本兼容      event.cancelBubble = true; // 在较旧的IE浏览器中,使用cancelBubble=true来停止事件冒泡    }  },  // ...};

3.性能优化

React 合成事件使用 事件池 来提高性能,即:重(chong)用事件对象。wpl28资讯网——每日最新资讯28at.com

这意味着:事件回调函数执行后,事件对象的所有属性都会被清除并回收以供重用,减少垃圾收集和内存使用的压力。wpl28资讯网——每日最新资讯28at.com

// 事件对象重用和回收的核心逻辑SyntheticEvent.prototype.destructor = function() {  this.target = null;  this.currentTarget = null;  this.dispatchConfig = null;  this._targetInst = null;  this.nativeEvent = null;  this.isDefaultPrevented = false;  this.isPropagationStopped = false;  // 清除所有属性....};// Event poolvar eventPool = [];// 从池中检索事件对象的函数SyntheticEvent.getPooled = function(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) {  if (eventPool.length) {    var instance = eventPool.pop();    SyntheticEvent.call(instance, dispatchConfig, targetInst, nativeEvent, nativeEventTarget);    return instance;  }  return new SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget);};// 将事件对象返回到池的函数SyntheticEvent.release = function(event) {  event.destructor();  eventPool.push(event);};

而 JavaScript 事件每次触发时都会创建一个新的事件对象,这可能会增加内存使用量和垃圾收集的频率,特别是当事件频繁触发时(例如:滚动 或 输入)。”wpl28资讯网——每日最新资讯28at.com

4.使用模式

React 通过 JSX语法 允许我们直接在组件的元素上声明事件处理函数(合成事件)。wpl28资讯网——每日最新资讯28at.com

React 会自动处理添加和删除事件监听器,确保组件安装时添加监听器,卸载时删除监听器,从而避免内存泄漏。wpl28资讯网——每日最新资讯28at.com

export default function Button() {  function handleClick() {    console.log('click!');  }  return <button onClick={handleClick}>点我</button>;}

Javascript 事件需要手动调用 addEventListener 添加事件监听器,同样手动调用removeEventListener 删除事件监听器:wpl28资讯网——每日最新资讯28at.com

document.addEventListener('DOMContentLoaded', function() {  const button = document.querySelector('button');  button.addEventListener('click', function() {    console.log('click');  });});

5.总结

所以,React 的合成事件是 React 提供了一种高度抽象和集成的事件处理方式,并且可以更好地处理浏览器兼容性以及优化(卸载事件)等问题。它最终依然会被解析成原生事件。wpl28资讯网——每日最新资讯28at.com

而 JavaScript 原生事件就是浏览器所提供的标准 API,使用时需要更多的处理兼容性以及性能等边缘逻辑。wpl28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-86998-0.htmlReact 合成事件和 JavaScript 事件有什么区别?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 如何用C++实现简单的内存池

下一篇: Python 编程速查:迅速理解 next() 函数

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 让我们一起聊聊文件的操作

    让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 这款新兴工具平台,让你的电脑效率翻倍

    这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • 2天涨粉255万,又一赛道在抖音爆火

    2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了&mdash;&mdash;贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 腾讯盖楼,字节拆墙

    腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    据 DIGITIMES 消息,英伟达 AI GPU 出货逐季飙升,接下来 AMD MI 300 系列将在第 4 季底量产。而半导体业内人士表示,近日传出 AMD 的 AI 芯片将转单给
  • iQOO Neo8 Pro即将开售:到手价3099元起 安卓性能最强旗舰

    iQOO Neo8 Pro即将开售:到手价3099元起 安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
  • 北京:科技教育体验基地开始登记

    北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top
Baidu
map