热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

React合成事件详解

这篇文章主要介绍了React合成事件的相关资料,帮助大家更好的理解和学习使用React,感兴趣的朋友可以了解下

react合成事件指的是react用js模拟了一个Dom事件流。(fiber树模拟Dom树结构) 合成事件的事件流在fiber树中发生捕获和冒泡。

从点击输入框开始

当你点击input输入框,react在根节点(注1)监听到focus事件(注2)(注3)。

如何从原生事件找到对应的虚拟Dom?

此时,react得到的信息只有原生事件对象(nativeEvent)。react通过nativeEvent对应的Dom(eventTarget),沿着Dom树向上找到距离该eventTarget最近的被react管理的Dom节点(注4)(注5),并获得对应的fiber A。

接着通过事件插件(注6),创建合成事件(注7)A。合成事件A被react视为模拟事件流中的事件源,fiber A被react视为事件目标。

合成事件流?

从fiber A出发向上(直到顶层fiber HostComponent为止)收集所有的host类型的fiber。 然后将收集到的fiber数组,从后向前(捕获),再从前向后(冒泡)遍历。每次遍历,会收集(注8)当前遍历项fiber节点的绑定的focus事件。之后(事件插件完成后,即合成事件生成好了)会按照收集的顺序执行foucs回调。 react就是这样模拟了事件流。

扩展

点击输入框引起多个事件

除了focus外,也触发了其他的事件--click等。react在根节点对不同类型的事件进行了监听,每监听到一种事件就会派发一次,多种类型的事件,会派发多次。 点击输入框,会先后触发focus和click。当focus事件的派发完后,就会派发click事件。 每次某个事件派发结束,会处理待处理的同步任务队列(flushSyncCallBackQueue)。

意料之外的render?

在NoMode模式下,多次派发事件且每个事件都改变了状态(如调用setState),则对应组件会被render多次。 在本例中,点击input输入框,如果给input绑定了focus事件和click事件并且事件回调都调用setState,input将会render两次。

为什么react中的input设置value后成为受控组件?

react中,在input设置了value属性的条件下,无论在输入框中输入什么,输入框的值都不会改变。除非你改变了input组件的state。 react在处理完模拟事件流后,会调用方法将一些意外的效果重置。 例如该场景,在input中输入了一个值,input输入框会出现你输入的值,但马上input的值会被对应的fiber的value属性更新(finishEventHander 重置受控组件)。 如果没有给input设置value则会忽略。

为什么合成事件属性有时无法访问?

因为react在事件流(捕获到冒泡)完后就将合成事件对象释放(SyntheticEvent.prototype.destructor 将合成事件对象的属性重置)。

react如何模拟事件的阻止冒泡、阻止默认行为?

react按照事件流顺序执行回调,在执行前会检查当前合成事件对象是否处于阻止冒泡的状态,如果是,则终止事件流。 react的合成事件对象原型对原生函数进行增强。对原生事件方法的阻止冒泡、阻止默认行为进行了封装(内部也调用原生事件的方法)。

注释

注1:根节点,在 react-v16 为 document ,在 react-v17 为挂载容器Dom
注2:focus事件并不是冒泡事件,react对非冒泡事件在捕获阶段监听
注3:根节点对所有事件进行了监听,除了特别例外submit、reset、invalid和媒体事件等
注4:react将fiber树挂载到Dom树上时,每个宿主(host)类型fiber节点与Dom节点一一对应,并链接
注5:向上查找是因为可能子Dom节点并不是被react管理的,如第三库滚动插件等
注6:为了模拟Dom事件,react进行的补充
注7:react内部一个构造函数的实例,合成事件的部分属性来源于nativeEvent。合成事件与fiber关联
注8:收集而不是执行。因为react针对某一类型事件的做了批处理

以上就是React合成事件详解的详细内容,更多关于React合成事件的资料请关注其它相关文章!


推荐阅读
  • 本文详细介绍了如何使用Spring Boot进行高效开发,涵盖了配置、实例化容器以及核心注解的使用方法。 ... [详细]
  • 本文详细介绍了W3C标准盒模型和IE传统盒模型的区别,探讨了CSS3中box-sizing属性的使用方法及其在布局中的重要性。通过实例分析,帮助读者更好地理解和应用这一关键概念。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文探讨了在Linux系统上使用Docker时,通过volume将主机上的HTML5文件挂载到容器内部指定目录时遇到的403错误,并提供了解决方案和详细的操作步骤。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
  • 本文探讨了在 ASP.NET MVC 5 中实现松耦合组件的方法。通过分离关注点,应用程序的各个组件可以更加独立且易于维护和测试。文中详细介绍了依赖项注入(DI)及其在实现松耦合中的作用。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 网易严选Java开发面试:MySQL索引深度解析
    本文详细记录了网易严选Java开发岗位的面试经验,特别针对MySQL索引相关的技术问题进行了深入探讨。通过本文,读者可以了解面试官常问的索引问题及其背后的原理。 ... [详细]
  • 自己用过的一些比较有用的css3新属性【HTML】
    web前端|html教程自己用过的一些比较用的css3新属性web前端-html教程css3刚推出不久,虽然大多数的css3属性在很多流行的浏览器中不支持,但我个人觉得还是要尽量开 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
author-avatar
Vicky家琦_745
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有