React是如何工作的?

news/2024/10/23 19:11:33/

从编写组件到最后屏幕生成界面,如上图所示,我们现在需要知道的就是后面几步是如何运行的。

概述

这张图解释了 React 渲染过程的几个阶段:

  1. 渲染触发:通过更新某处的状态来触发渲染。
  2. 渲染阶段:React 调用组件函数,确定如何更新 DOM。这是内部计算阶段,不会立即对屏幕产生视觉变化。
  3. 提交阶段:React 实际写入 DOM,进行元素的更新、插入和删除。
  4. 浏览器绘制:浏览器将更新后的内容绘制到屏幕上。

在 React 中,渲染并不是指更新 DOM 或在屏幕上显示元素。渲染仅在 React 内部发生,不会直接产生视觉变化。

 渲染触发

渲染触发条件

  1. 初次渲染:应用程序的初始渲染。
  2. 状态更新:一个或多个组件实例的状态更新(重新渲染)。

直觉上的状态更新如下:

但其实并不是,实际上它是批量更新的。

例子如下:

关键点

  • 渲染过程是为整个应用程序触发的。
  • 实际上,看起来 React 只重新渲染状态更新的组件,但背后工作并非如此。
  • 渲染不会立即触发,而是安排在 JavaScript 引擎有空闲时间时执行。事件处理程序中的多个 setState 调用也会进行批处理。

渲染阶段

什么是虚拟DOM? 

它只是一个javascript对象。

为什么需要协调(Reconciliation)和区别(diffing)?

纤维树(Fiber tree)是什么? 

  • React 元素树(虚拟 DOM):左侧显示了一个 React 组件树,包含组件如 AppVideoModalOverlayh3 和 button。这是 React 的虚拟 DOM 表示。
  • Fiber 树:右侧是 Fiber 树,它在初次渲染时被创建。每个组件实例和 DOM 元素都有一个对应的“fiber”。
  • Fiber:每个 fiber 是一个“工作单元”,包含以下信息:
    • 当前状态
    • 属性(Props)
    • 副作用
    • 使用的钩子(hooks)
    • 工作队列
  • 纤维树的特点
    • 内部树结构:每个组件实例和DOM元素都有一个对应的“fiber”。这些fiber节点形成了一个树状结构,用于描述UI界面。
    • Fiber节点不在每次渲染时重新创建:这意味着React可以复用已有的fiber节点,从而减少不必要的计算和内存使用。
    • 异步渲染

      • 异步完成工作:Fiber允许将渲染任务分成小块,利用浏览器的空闲时间进行处理。这种方式避免了长时间阻塞主线程,提高了应用的响应性。
      • 任务优先级调度:React可以根据任务的重要性来决定执行顺序,优先处理用户交互等关键任务。
    • 并发特性

      • 支持并发特性:Fiber架构支持React中的并发模式,使得应用能够更好地处理复杂交互和动态变化,例如Suspense或过渡效果。
      • 长时间渲染不会阻塞JavaScript引擎:通过将渲染过程分割成小块,React能够在不中断用户界面的情况下进行更新。
    • 具体实现

      • 增量式渲染:通过将渲染任务分配到多个帧中,React可以保持应用的流畅性,即使在复杂布局或大量计算时也能保持响应。
      • 可中断和恢复的渲染:在需要时,React可以暂停当前任务,并在稍后恢复,从而提高用户体验。

 协调(Reconciliation)举例

 区分(Diffing)举例

key prop是什么?

在list中使用key prop

使用key prop重置状态 

这不是我们想要的,需要使用key prop进行重置state。

 提交阶段

绘制阶段

总结


http://www.ppmy.cn/news/1541423.html

相关文章

Java项目-基于springboot框架的校园疫情防控系统系统项目实战(附源码+文档)

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…

删除node_modules文件夹

前言 当安装了较多模块后,node_modules目录下的文件会很多,直接删除整个目录会很慢,下面介绍些快速删除node_modules目录的方法。 方法一:使用rimraf模块的命令 在全局安装rimraf模块,然后通过其命令来快速删除node…

Python爬取京东商品信息,详细讲解,手把手教学(附源码)

Python 爬虫爬取京东商品信息 下面我将逐一解释每一部分的代码 导入库 from selenium import webdriver from selenium.webdriver.edge.service import Service from selenium.webdriver.edge.options import Options import time import random import csv from selenium.c…

论文阅读-三维结构几何修复(导-4)

摘要 解决了3D数字模型中大洞修复的问题。 通过基于字典学习的方法解决了缺失区域推断问题,该方法利用从单个自相似结构和在线深度数据库中得出的几何先验。利用几何先验提供的线索,从洞的边界周围自适应地传播局部3D表面平滑性来恢复底层表面。在合成…

Yocto构建i.MX处理器目标镜像

1. 初始化构建环境 首先&#xff0c;通过运行imx-setup-release.sh脚本来初始化Yocto构建环境。此脚本的标准语法如下&#xff1a; $ DISTRO<distro name> MACHINE<machine name> source imx-setup-release.sh -b <build dir>DISTRO<distro configurati…

CSMA/CD协议 监听算法

IEEE802.3规定的CSMA/CD协议可以利用多种监听算法来减少发送冲突的概率,下面关于各种监听算法的描述中,正确的是() A.非坚持型监听算法有利于减少网络空闲的时间 B.坚持型监听算法有利于减少冲突的概率 C.P坚持型监听算法无法减少网络的空闲时间 D.坚持型监听算法能够及时抢…

【雷电模拟器命令合集操作大全】官方文档整理贴

此贴是官方的帮助整理文档在这里插入代码片 一起来看看几个主要命令&#xff0c;大部分命令读者可以自己试试~ 1、launch 支持2种启动雷电模拟器的方式 –name顾名思义&#xff0c;应该是模拟器的标题栏的名字&#xff0c;本人经过验证果然如此! –index mnq_idx&#xff0c;模…

【VUE】Vue中 computed计算属性和watch侦听器的区别

核心功能不同 computed 是一个计算属性&#xff0c;其核心功能是基于已有的数据属性计算得出新的属性值。当某个依赖的数据发生变化时&#xff0c;computed 会自动重新计算并更新自己的值。因此&#xff0c;可以将 computed 看做是一种“派生状态”。 watch 是一个观察者函数&…