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 事件机制是一个代理模式,所有处理都由根组件监听并进行分发处理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据可视化案例

数据可视化案例 使用豆瓣电影中的数据来进行可视化&#xff0c;网址&#xff1a;豆瓣电影 Top 250 (douban.com) 一、网页数据分析 我们需要爬取的是豆瓣电影Top250网页每一页的电影名称、图片链接、导演、年份、国家、电影类型、电影评分这些数据。 在待爬取的网页中&#x…

17岁中专女生,闯进全球数学竞赛12强

今年阿里的数学竞赛结果出来了&#xff0c;在榜单的前列包含一个 17 岁的中专女生。 在 2018 年时&#xff0c;阿里巴巴达摩院发起了一个国际数学竞赛&#xff0c;基本每年举办一次&#xff0c;参赛不设报名条件&#xff0c;向全球所有数学爱好者开放&#xff0c;竞赛由阿里创…

AOSP平台开发的利器——Android Studio for Platform

Android Studio for Platform (ASfP) 是一个为使用 Soong 构建系统构建的 Android 开源项目&#xff08;AOSP&#xff09;平台开发者而设计的 Android Studio IDE 版本。与标准 Android Studio 不同&#xff0c;ASfP 具有多语言支持&#xff0c;可以在同一 IDE 中编写 C、Kotli…

java高级——Arrays工具类(包含核心的归并和二分排序以及多个底层知识点)

java高级——Arrays工具类 前情提要文章介绍提前了解的知识点1 二分查找思想 Arrays常用方法介绍&#xff08;8大类&#xff09;1. 创建数组1.1 copyOf&#xff08;&#xff09;1.2 copyOfRange&#xff08;&#xff09;1.3 fill&#xff08;&#xff09; 2. 数组转集合&#x…

数据库-数据定义和操纵-初始MySQL数据库

连接数据库&#xff1a; mysql -u用户名 -p密码 创建数据库&#xff1a; create database 数据库名; 命令查看MySQL中已存在的数据库 show database; 数据库中创建表的规则&#xff1a; CREATE TABLE 表名 (字段名,数据类型,字段名,数据类型,..... ) eg: 首先创建数据库&am…

操作系统—页表(实验)

文章目录 页表1.实验目标2.实验过程记录(1).增加打印页表函数(2).独立内核页表(3).简化软件模拟地址翻译 3.实验问题及相应解答问题1问题2问题3问题4 实验小结 页表 1.实验目标 了解xv6内核当中页表的实现原理&#xff0c;修改页表&#xff0c;使内核更方便地进行用户虚拟地址…

youlai-boot项目的学习—工程构建与运行

开发环境 系统:mac OS Ventura 13.2.1 终端: item2 Homebrew: 4.3.5 IDE: IntelliJ IDEA 2024.1.1 (Ultimate Edition) 代码分支 仓库&#xff1a;https://gitee.com/youlaiorg/youlai-boot.git 分支&#xff1a; master commit: 9a753a2e94985ed4cbbf214156ca035082e02723 …

python数据分析---ch11 python数据描述性统计

python数据分析--- ch11 python数据描述性统计 1. Ch11--描述性统计2. 数据集中趋势的度量2.1 平均值2.2 中位数2.3 众数2.4 几何平均值2.5 调和平均值 3. 数据离散趋势的度量3.1 极差3.2 平均绝对偏差(MAD)3.3 方差和标准差3.4 下偏方差和下偏标准差3.5 目标下偏方差和目标下偏…

【Qt项目专栏】贪吃蛇小游戏1.0

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 贪吃蛇小游戏1.0 项目编号&#xff1a;01 文章目录 贪吃蛇小游戏1.0一…

生信技能48 - 如何获取基因的SNP及RefSeq参考序列命名规则

1. SNP概念 SNP 是指基因组水平上由单个核苷酸的变异所引起的DNA 序列多态性,在群体中的发生频率不小于1 %,包括单个碱基的转换、颠换、插入和缺失等。每核苷酸发生突变的概率大约为10 -9 , 由于压力选择,SNP在单个基因和基因组以及动物不同种群间分布是不均匀的,在非编码…

虚拟机使用桥接模式网络配置

1、获取本机的网络详细信息 windowr 输入cmd 使用ipconfig -all 一样即可 在自己的虚拟机中设置网络 虚拟机中的ip ---------192.168.36.*&#xff0c;不要跟自己的本机ip冲突 网关-----------192.168.36.254 一样即可 dns -----------一样即可&#xff0c;我多写了几个&am…

C | 在ubuntu22下开发的一些配置

目录 VScode设置 要下载的插件&#xff1a; 卸载VScode的话就是哪装的哪删。 浅用gcc 预处理指令 使用gcc 语言编译过程 1. 预处理&#xff08;Preprocessing&#xff09; 2. 编译&#xff08;Compilation&#xff09; 3. 汇编&#xff08;Assembly&#xff09; 4. …

最长回文子串问题详解

最长回文子串的问题描述&#xff1a;给出一个字符串S&#xff0c;求S的最长回文子串的长度。 针对这个问题&#xff0c;先看暴力解法&#xff1a;枚举子串的两个端点i和j&#xff0c;判断在[i,j]区间内的子串是否回文。从复杂度上来看&#xff0c;枚举端点需要&#xff0c;判断…

Linux、Windows安全加固

为了减少系统被黑客入侵&#xff0c;对操作系统的安全加固是网络安全和主机安全必不可少的一部分。 一、Linux安全加固 1.不使用默认的ssh端口&#xff0c;修改默认ssh22端口号 sudo vim /etc/ssh/ssh_config 去掉#注释&#xff0c;修改端口号并保存 2.关闭不必要的系统服务…

芯片验证分享8 —— 代码审查2

大家好&#xff0c;我是谷公子&#xff0c;上节课给大家讲了代码审查中的代码正向检查&#xff0c;今天我们来讲代码审查的其他方法。 今天介绍的检查方法有&#xff1a; 代码反向检查 桌面检查 同行评审 可用性验证 这些验证方法可以应用在芯片开发的任何阶段。代码审查…

vitepress搭建的博客系统cdn引入github discussions评论系统

github仓库必须是公开的。 按照CDN的方式引入 打开discussions模块 安装giscus app 配置giscus 就是刚安装了giscus app的仓库 页面往下走&#xff0c;生成了代码&#xff1a; 配置vitepress 采用了CDN的方式引入 使用web component 随便找个地方试试组件 效果 有了…

Windows 托盘图标实现类封装及使用(附源码)

在系统桌面右下角的托盘区域,创建一个托盘图标,已经是很多软件的标配了,特别是IM即时通讯软件,要在托盘图标上显示来消息时的闪动头像。 其实托盘图标创建很简单,使用起来也比较方便,主要是调用Shell_NotifyIcon API函数,传入不同参数表示对应的操作: 1)NIM_AD…

ROS创建一个软件包

 首先&#xff0c; 配置您的 ROS 2 安装环境。 让我们使用您在 先前教程 中创建的工作空间 ros2_ws 来创建您的新软件包。 在运行软件包创建命令之前&#xff0c;请确保您位于 src 文件夹中。 LinuxmacOSWindows cd ~/ros2_ws/src在ROS 2中创建新包的命令语法如下&#…

R进阶使用技巧

Introduction 分享一些R进阶使用的技巧&#xff0c;相当于是之前写的R语言学习的实践和总结了。 Online slide: https://asa-blog.netlify.app/R_tips_for_advanced_use_byAsa/R_tips.html 下载slide和相关的各种test文件: https://asa-blog.netlify.app/R_tips_for_advanced…

会声会影2024一共新增了8项功能

会声会影2024一共新增了8项功能。 一、语音转文字视频中语音能自动转换成文本&#xff0c;节省手动创建字幕时间&#xff01;会声会影2022可以捕获视频中的字幕&#xff0c;并将它应用到任何地方。这个功能是我觉得本次更新中最强大的&#xff0c;再也不需要为手动输入字幕发愁…