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

React 中的事件处理

React 中是如何处理事件的,现在下面简单的一段代码:

export default function App() {const AList = lazy(()=>import('./List.js'))const r = useRef(null)  const [show, setShow] = useState(false);return (<><button onFocus={()=>{setShow(!show)}} >加载组件</button>{show ? <Suspense fallback="loading"><AList items={[{id:1, text:"123"}]}>asdf</AList></Suspense>:""}</>);
}

代码为 Button 绑定了 onFocus 事件,这里用 onFocus 是为了方便 debug。如果做一个框架要接管所有的事件处理,我们想一下应该如何处理,可以通过代理的方式,把所有可以监听到的事件交给代理去处理,最后在交给框架组件上绑定的对应事件进行处理。由于 JS 是冒泡事件模型,所有事件都会向上传递,只要监听最顶层容器就可以监听到所有事件,当点击发生的时候调用目标组件绑定的事件。

在这里插入图片描述
我们看一下,React 中怎么处理的。

组件注册事件

创建 Element,添加 props,这个 props 中就是 Focus 方法,将最终方法于 Element 绑定并包存在 Fiber 上。
在这里插入图片描述
绑定代码
在这里插入图片描述

Root 代理所有事件

创建 Root 时会监听所有事件:
在这里插入图片描述
方法中 loop 所有 Html 原生事件

在这里插入图片描述

事件触发

Focus 事件触发时,会执行 dispatchDiscreteEvent 方法,这个方法在 Root 代理监听时进行的绑定。
在这里插入图片描述
获取组件事件处理方法,这个方法在组件创建时进行的绑定。
在这里插入图片描述

总结

React 事件机制是一个代理模式,所有处理都由根组件监听并进行分发处理。

相关文章:

  • 如何确保数据跨域交换安全、合规、可追溯性?
  • java中Array(数组)、List(列表)、Set(集合)、Map(映射)、Queue(队列)详解
  • 【面试题】MySQL常见面试题总结
  • 深度学习第二章
  • Perplexity AI — 探索网络,发掘知识,沟通思想
  • 基于鲸鱼优化的DSN弱栅栏覆盖算法matlab仿真
  • MySQL之优化服务器设置(五)
  • 几何公差的设计和选用
  • k8s-kubernetes常用命令,服务部署,可视化控制台安装及token的生成
  • 【Android面试八股文】在Android中,出现ClassNotFound的有可能的原因是什么?
  • 富格林:细心发现虚假确保安全
  • 分层解耦
  • 【高端精品】最新手机版微信小程序(拼多多+京东)全自动操作项目
  • springcloud入门与实践
  • Django 中间件
  • ----------
  • 时间复杂度分析经典问题——最大子序列和
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Apache Pulsar 2.1 重磅发布
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Fastjson的基本使用方法大全
  • java8-模拟hadoop
  • JavaScript实现分页效果
  • laravel 用artisan创建自己的模板
  • Node项目之评分系统(二)- 数据库设计
  • Python中eval与exec的使用及区别
  • Redis 中的布隆过滤器
  • SegmentFault 2015 Top Rank
  • SpriteKit 技巧之添加背景图片
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 简单基于spring的redis配置(单机和集群模式)
  • 看域名解析域名安全对SEO的影响
  • 来,膜拜下android roadmap,强大的执行力
  • 聊聊redis的数据结构的应用
  • 学习笔记TF060:图像语音结合,看图说话
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 正则表达式小结
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​第20课 在Android Native开发中加入新的C++类
  • #、%和$符号在OGNL表达式中经常出现
  • #pragma once与条件编译
  • #预处理和函数的对比以及条件编译
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (C语言)fgets与fputs函数详解
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (三分钟)速览传统边缘检测算子
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (万字长文)Spring的核心知识尽揽其中
  • (循环依赖问题)学习spring的第九天
  • (转)setTimeout 和 setInterval 的区别