react【框架原理详解】JSX 的本质、SyntheticEvent 合成事件机制、组件渲染过程、组件更新过程

JSX 的本质

JSX 代码本身并不是 HTML,也不是 Javascript,在渲染页面前,需先通过解析工具(如babel)解析之后才能在浏览器中运行。

babel官网可查看 JSX 解析后的效果

在这里插入图片描述
更早之前,Babel 会把 JSX 转译成一个 React.createElement() 函数调用,功能与现在的 jsxs 函数类似

React.createElement() 的语法
相当于 vue 的 h 函数

  • 第1个参数:标签名(字符串),或组件(变量)
  • 第2个参数:属性为key 的对象
  • 之后的参数是子元素,多个子元素,也可以用数组包裹放在第三个元素的位置
  • 返回 vnode

例如

const element = (
  <h1 className="greeting">
    Hello, world!
  </h1>
);

会被Babel 转译为

const element = React.createElement(
  'h1',
  {className: 'greeting'},
  'Hello, world!'
);

React.createElement() 会创建对象

// 注意:这是简化过的结构
const element = {
  type: 'h1',
  props: {
    className: 'greeting',
    children: 'Hello, world!'
  }
};

这些对象被称为 “React 元素”。它们描述了你希望在屏幕上看到的内容。React 通过读取这些对象,然后使用它们来构建 DOM 并保持随时更新。

SyntheticEvent 合成事件机制

react 中的事件,不是原生事件(vue 中是原生事件),而是SyntheticEvent 合成事件。

为什么要用合成事件机制 ?

  • 更好的兼容性和跨平台(自定义封装的合成事件对象,更方便添加兼容性和跨平台的相关代码)
  • 统一挂载到 document 或 id 为root 的根节点 (从 react 17 开始是 root ),可以减少内存消耗,避免频繁解绑
  • 方便事件的统一管理(如事务机制)

为什么从 react 17 开始,要改为绑定到 root?
因为这样更利于多个 React 版本并存,例如微前端。

在这里插入图片描述

组件渲染过程

  • 通过 props ,state 初始化变量
  • 通过 render() 函数生成虚拟节点 vnode
  • 通过 patch(elem, vnode) 函数(不一定叫 patch,具体可能是其他名字,功能相同)渲染页面

组件更新过程

  • 通过 setState(newState) 修改响应式变量,生成 dirtyComponents (可能有子组件)
  • 通过 render() 函数生成虚拟节点 vnode
  • 通过 patch(elem, vnode) 函数(不一定叫 patch,具体可能是其他名字,功能相同)渲染页面

更新的 patch 分为两个阶段

  • reconciliation 阶段-执行 diff 算法,纯 JS 计算
  • commit 阶段-将 diff 结果渲染 DOM

之所以分为了两个阶段,是为了方便 fiber 优化性能

fiber 优化性能的原理

fiber 是 React 的内部运行机制

  • 将 reconciliation 阶段拆分成多个任务(commit 阶段无法拆分)
  • 当 DOM 需要渲染时暂停 reconciliation 中的任务,等无需进行 DOM 渲染时继续执行 reconciliation 中的任务

通过 window.requestIdleCallback 可获知 DOM 是否需要渲染,但 window.requestIdleCallback 有的浏览器不支持,所以在不支持window.requestIdleCallback 的浏览器上,无法使用 fiber 优化性能

哪些场景需要 fiber 优化性能 ?

因 JS 是单线程,且和 DOM 渲染共用一个线程,当组件足够复杂,组件更新时,计算和渲染的压力都很大,同时再有 DOM 操作需求(动画,鼠标拖拽等),就很容易出现页面卡顿(DOM 渲染等待 JS 计算)

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

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

相关文章

论文精读:UFO: A UI-Focused Agent for Windows OS Interaction

UFO : A UI-Focused Agent for Windows OS Interaction Status: Reading Author: Bo Qiao, Chaoyun Zhang, Dongmei Zhang, Liqun Li, Minghua Ma, Qinglong Zhang, Qingwei Lin, Saravan Rajmohan, Shilin He, Si Qin, Xiangyu Zhang, Yu Kang Institution: 微软&#xff08;…

骑行之旅,骑行之旅,骑行之旅

骑行之旅其一&#xff1a;晨曦破晓普吉路&#xff0c;铁骑奔腾向远方。小桃园中寻雅趣&#xff0c;保利春湖泛波光。落水洞边环水库&#xff0c;田冲村里话家常。秧草塘畔风情美&#xff0c;白泥塘中歌声扬。陡普鲁村享盛宴&#xff0c;AA 制下笑语长。赛道体验激情涌&#xff…

有什么免费的文字转语音软件?这5个文字转语音工具超简单

听说你对最近备受瞩目的文字转语音技术很感兴趣&#xff1f; 文字转语音技术&#xff0c;就是一种将文本转换为自然语音的技术&#xff0c;它让机器发音听起来就像真人一样。那么&#xff0c;市面上的文字转语音软件种类繁多&#xff0c;选择起来就有些困难了。 别担心&#…

【cocos creator】进度条控制脚本,支持节点进度条,图片进度条,进度条组件,和进度文字展示

进度条控制脚本&#xff0c;支持节点进度条&#xff0c;图片进度条&#xff0c;进度条组件&#xff0c;和进度文字展示 const { ccclass, property, menu } cc._decorator;let text_type cc.Enum({"20%": 0,"1/5": 1,"差值": 2,"自定义…

开放式耳机怎么选择!教你几招!2024开放式蓝牙耳机推荐

在面对市场上琳琅满目的开放式耳机时&#xff0c;许多用户可能会感到难以抉择。作为一名开放式耳机的爱好者&#xff0c;我根据自己的实际使用体验&#xff0c;整理了一些我认为值得推荐的开放式耳机&#xff0c;希望能为正在寻找合适耳机的朋友们提供一些参考和帮助。我将为大…

Nodejs+Websocket+uniapp完成聊天

前言 最近想做一个聊天&#xff0c;但是网上的很多都是不能实现的&#xff0c;要么就是缺少代码片段很难实现websocket的链接&#xff0c;更别说聊天了。自己研究了一番之后实现了这个功能。值得注意的是&#xff0c;我想在小程序中使用socket.io&#xff0c;不好使&#xff0…

英语学习笔记24——Give me/us/him/her/them some ...

Give me/us/him/her/them some … 给我/我们/他/她/他们一些…… 词汇 Vocabulary desk n. 课桌&#xff08;有书桌堂&#xff09;&#xff0c;写字台 复数&#xff1a;desks 搭配&#xff1a;desk mate 同桌    构成&#xff1a;desk mate 桌子上的伙伴 同桌    cl…

深度学习模型keras第二十三讲:在KerasCV中使用SAM进行任何图像分割

1 SAM概念 ###1.1 SAM定义 Segment Anything Model&#xff08;SAM&#xff09;是一种基于深度学习的图像分割模型&#xff0c;其主要特点包括&#xff1a; 高质量的图像分割&#xff1a;SAM可以从输入提示&#xff08;如点、框、文字等&#xff09;生成高质量的对象掩模&am…

【Hive SQL 每日一题】行列转换

文章目录 行转列列传行 行转列 测试数据&#xff1a; DROP TABLE IF EXISTS student_scores;CREATE TABLE student_scores (student_id INT,subject STRING,score INT );INSERT INTO student_scores (student_id, subject, score) VALUES (1, Math, 85), (1, English, 78), (…

高效爬取Reddit:C#与RestSharp的完美结合

介绍 在数据驱动的时代&#xff0c;网络爬虫已经成为获取网页数据的重要工具。Reddit&#xff0c;作为全球最大的社区平台之一&#xff0c;以其丰富的用户生成内容、广泛的讨论话题和实时的信息更新吸引了大量用户。对于研究人员和开发者而言&#xff0c;Reddit提供了宝贵的数…

VMware Workstation 虚拟机安装 ubuntu 24.04 server 详细教程 服务器安装图形化界面

1 阿里云下载 ubuntu-releases安装包下载_开源镜像站-阿里云 2 打开vmware,新建虚拟机 3 选择下载的镜像,开始安装 3 光驱这里修改下 4 重新启动&#xff0c;安装图形化界面 #更新软件包列表 sudo apt-get update #安装Ubuntu图形桌面 sudo apt install ubuntu-desktop 5 安…

南京沁恒微USB HUB CH334/CH335多种封装规格选择,外围简单,价格还美丽

概述&#xff1a; CH334 和 CH335 是符合 USB2.0 协议规范的 全速&#xff0c;下行端口支持 USB2.0 高速 480Mbps 个 TT 分时调度 4 个下行端口&#xff09;&#xff0c;还支持高性能的 工业级设计&#xff0c;外围精简&#xff0c;可应用于计算机和工控机主板 特点&#xff1…

单细胞分析(Signac): PBMC scATAC-seq 整合

引言 在本教学指南中&#xff0c;我们将探讨由10x Genomics公司提供的人类外周血单核细胞&#xff08;PBMCs&#xff09;的单细胞ATAC-seq数据集。 加载包 首先加载 Signac、Seurat 和我们将用于分析人类数据的其他一些包。 if (!requireNamespace("EnsDb.Hsapiens.v75&qu…

数据源管理|JDBC|JdbcTemplate|MybatisPlusGenerator

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 复杂的项目常常会涉及到多数据源的配置&#xff0c;解决方案也是有很多。但这篇文章不是讲这个的&…

el-table 实现嵌套表格的思路及完整功能代码

要实现的需求是这样的&#xff1a; 本来我是用 el-table 的 :span-method 方法实现的&#xff0c;但发现合并起来有问题&#xff0c;跟我的需求差距有些大&#xff0c;于是我想到了嵌套表格。但是嵌套完之后的样子也是很奇怪&#xff1a; 不要气馁&#xff0c;思路还是对的&a…

MacOS使用PhpStorm+Xdebug断点调式

基本环境&#xff1a; MacOS m1 PhpStorm 2024.1 PHP7.4.33 Xdebug v3.1.6 1、php.ini 配置 [xdebug] zend_extension "/opt/homebrew/Cellar/php7.4/7.4.33_6/pecl/20190902/xdebug.so" xdebug.idekey "PHPSTORM" xdebug.c…

SpringBoot集成Logback将日志写入文件夹

一、logback简介&#xff1a; 目前比较常用的ava日志框架:Logback、log4j、log4j2、JUL等等。 Logback是在log4j的基础上重新开发的一套日志框架&#xff0c;是完全实现SLF4J接口API(也叫日志门面)。 Logback 的架构非常通用&#xff0c;可以应用于不同的环境。目前logback分为…

【人工智能项目】小车障碍物识别与模型训练(完整工程资料源码)

实物演示效果: 一、绪论: 1.1 设计背景 小车障碍物识别与模型训练的设计背景通常涉及以下几个方面: 随着自动驾驶技术的发展,小车(如无人驾驶汽车、机器人等)需要能够在复杂的环境中自主导航。障碍物识别是实现这一目标的关键技术之一,它允许小车检测并避开路上的障碍物…

C++-函数

函数&#xff08;Function&#xff09;&#xff1a;是一个提前封装好的、可重复使用的、完成特定功能的独立代码单元。 特点&#xff1a;提前封装、可重复使用的、完成特定功能 将针对特定功能的、有重复使用需求的代码&#xff0c;提前封装到函数内&#xff0c; 在需要的时候…

IEN在Web3.0中的性能与安全优势

随着Web3.0的快速发展&#xff0c;优化网络基础设施变得至关重要。智能生态网络&#xff08;Intelligent Ecological Network, IEN&#xff09;作为新一代网络架构&#xff0c;在提升性能与增强安全方面展现出巨大潜力。本文将深入探讨IEN在Web3.0中的技术优势&#xff0c;并展…