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

React 元素的生命周期

文章目录

  • 前言
    • 🧱 一、React Element 是什么?
    • 🧠 二、React 元素生命周期总览图
    • 🚦 三、生命周期阶段详解(函数组件为例)
    • 🧩 四、可视化:函数组件挂载过程(简化流程图)
    • 🔁 五、更新过程(例如:点击按钮改变文本)
    • ❌ 六、卸载过程(如条件渲染中被隐藏的组件)
    • 🧪 补充:Fiber 中如何处理 Element?
    • ✅ 总结一句话


前言

可视化地讲解 React 元素(Virtual DOM)的生命周期,包括:

  1. React Element 是什么
  2. 从 JSX 到真实 DOM 的全过程
  3. 涉及的生命周期钩子
  4. 组件挂载 / 更新 / 卸载的流程图

🧱 一、React Element 是什么?

React Element 是 JSX 表达式转换后的结果,它只是一个用于描述 UI 的普通 JS 对象

// JSX
<h1 className="title">Hello</h1>// 被编译为:
React.createElement('h1', { className: 'title' }, 'Hello')// 返回:
{$$typeof: Symbol(react.element),type: 'h1',props: {className: 'title',children: 'Hello'}
}

它不是 HTML 也不是 DOM,而是虚拟 DOM,用于告诉 React:我要渲染什么内容。


🧠 二、React 元素生命周期总览图

[JSX] --> [React.createElement()] --> [Virtual DOM Tree]|[Reconciliation (Diff)]|[Fiber 架构调度 + commit 阶段]|[真实 DOM 创建/更新]↓[组件生命周期钩子触发]

🚦 三、生命周期阶段详解(函数组件为例)

阶段发生什么涉及内容
① 创建阶段JSX 被转为 React Element 对象React.createElement
② 构建虚拟 DOM所有 Element 被组成树结构Fiber Tree
③ 调和阶段与上次的 Fiber 比对差异reconciliation
④ 提交阶段更新真实 DOM + 触发生命周期钩子useEffect、DOM API
⑤ 更新阶段状态变化 → 触发新 Element → 重走 Diff 流程useEffect, useMemo
⑥ 卸载阶段DOM 被移除 → 清理副作用useEffect cleanup

🧩 四、可视化:函数组件挂载过程(简化流程图)

            App()↓JSX: <h1>Hello</h1> 返回↓React.createElement → React Element↓Fiber 构建(VNode 树)↓Diff:新 vs 旧(首次无旧 → 全部挂载)↓Commit:创建 DOM(document.createElement)↓插入页面(appendChild)↓useEffect(() => { ... }, []) 触发

🔁 五、更新过程(例如:点击按钮改变文本)

setState() 触发↓
新 JSX 生成新 Element↓
新 Fiber Tree 与旧 Fiber Tree Diff↓
找出差异(如文本变化)↓
只更新需要变更的 DOM(如 innerText)↓
commit 阶段完成↓
useEffect() 执行更新后的副作用

❌ 六、卸载过程(如条件渲染中被隐藏的组件)

Component 被从 JSX 移除↓
React Diff 检测到组件已不存在↓
Fiber 标记为 `deletion`↓
DOM 元素从页面中删除↓
useEffect cleanup 执行

🧪 补充:Fiber 中如何处理 Element?

  • 每个 React Element 会被包装为 Fiber 节点(FiberNode)
  • Fiber Tree 是一棵链式结构树(child → sibling → return)
  • rendercommit 两阶段分别处理计算 & DOM 更新

✅ 总结一句话

React Element 是 UI 的描述符,它的生命周期跨越了虚拟 DOM 构建、Fiber 调度、DOM 渲染与副作用清理,每一次 setState 其实都在触发一次“React Element → DOM” 的完整生命周期流。


http://www.xdnf.cn/news/13340.html

相关文章:

  • 从硬件视角审视Web3安全:CertiK CTO主持Proof of Talk圆桌论坛
  • GO 入门小项目-博客-结合Gin Gorm
  • 【面板数据】中国与世界各国农产品进出口贸易数据(2015-2024年)
  • 国内外数据要素标准有何不同?
  • K8S项目需求分析
  • 火山引擎发布豆包大模型 1.6 与视频生成模型 Seedance 1.0 pro
  • ABP vNext + Spark on Hadoop:实时流处理与微服务融合
  • 嵌入式学习笔记 - C语言访问地址的方式,以及指针的进一步理解
  • JMeter 处理 UTF-16 转 UTF-8 乱码问题解决方案(deepseek)
  • AnythingLLM配置Milvus后,上传文档提示向量数据库标识符错误的解决办法
  • 鹰盾Win播放器作为专业的视频安全解决方案,除了硬件翻录外还有什么呢?
  • 微信小程序分享带参数地址
  • UFS-Ver3.1-第八章
  • 6.11 打卡
  • 对话机器人预测场景与 Prompt / 模型选择指南
  • 探究:什么是扁平化组织?有什么益处?
  • gitlab相关操作
  • 实战案例-FPGA的JESD204调试问题解析
  • 青少年编程与数学 01-011 系统软件简介 13 Microsoft SQL Server数据库
  • 关于使用WebSocket时无法使用@Autowired 注入的问题
  • CompletableFuture浅谈
  • Efficient Attention 理解
  • 美团完整面经
  • Matlab解决无法读取路径中的空格
  • matlab分布式电源微电网潮流
  • uni-app 自定义路由封装模块详解(附源码逐行解读)
  • FEMFAT许可使用数据分析工具介绍
  • MySQL 主从复制与一主多从架构实战详解
  • Electron-vite【实战】MD 编辑器 -- 编辑区(含工具条、自定义右键快捷菜单、快捷键编辑、拖拽打开文件等)
  • 深入理解 TCP 套接字:Socket 编程入门教程