码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • React 渲染流程分析


    React 页面是由组件组成的,从根组件直到叶组件,内部的组件数通过 Fiber 来保存并触发并发更新。页面的展示分为两部分,首先是初始化,所有组件首次展示,都要进行渲染,之后是更新流程,也就是页面产生了交互,需要某些组件出现状态变更,React 内部找到需要更新的组件并进行更新。本文从源代码的角度,对 React 的初始化以及更新过程进行梳理:

    JSX编译

    JSX 是一种 HTML 代码模板,JavaScript 引擎原生并不支持 JSX 语法,因此,运行时需要首先将 JSX 转为浏览器可以执行的 JS 代码。React 通过 Babel 插件 plugin-transform-react-jsx 将 JSX 装换为 JS,下图中 Bundle.js 中包含最终转换好的 JS。
    在这里插入图片描述

    createRoot

    首先,绑定 Root 容器到 Dom 节点,所有 Root 下的组件全部展示在 Dom 节点下。createRoot -> createContainer -> createFiberRoot,最终返回的是 FiberRoot
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    render

    firerNode 创建完成之后,调用 root.render,是整个App 渲染的入口。
    在这里插入图片描述
    updateContainer 中有 Lane 的概念,Lane 和优先级有关系,以后具体再看起什么作用
    在这里插入图片描述
    进入 scheduleFiber,调度 Fiber 任务
    在这里插入图片描述
    进入 performConcurrentWorkOnRoot,并发执行任务
    在这里插入图片描述
    进入 renderRootSync,同步渲染 Root
    在这里插入图片描述
    进入 workLoopSync,循环处理任务
    在这里插入图片描述
    进入 performUnitOfWork, 开始处理任务
    在这里插入图片描述

    进入 beginWork,渲染开始
    在这里插入图片描述
    开始创建 FiberNode
    在这里插入图片描述
    进入reconcileChildren,进行对比
    在这里插入图片描述
    进入处理单个节点逻辑
    在这里插入图片描述
    进入创建 Fiber 方法
    在这里插入图片描述
    通过上面的步骤,FiberTree创建完成。下面进入 Commit 阶段,回到performConcurrentWorkOnRoot,进入 finishConcurrentRender:
    在这里插入图片描述
    最终进入 commitMutationEffects,找到需要修改的节点
    在这里插入图片描述
    进入commitMutationEffectsOnFiber
    在这里插入图片描述
    递归处理所有子节点
    在这里插入图片描述
    处理最终渲染
    在这里插入图片描述
    Dom 节点操作
    在这里插入图片描述

    总结

    React 渲染流程代码比较多,入口在 Root.render,并发执行 Render,同步执行 Commit。

  • 相关阅读:
    【Web】| CSS Float (浮动)的使用方法
    【期末网页设计】基于HTML学生信息管理系统网页项目的设计与实现
    【数据结构】栈和队列专题
    python连接mysql数据库的练习
    EasyCVR通过国标GB协议接入设备,TCP正常注册但UDP无法成功注册的原因分析
    小程序:如何合理规划分包使主包不超过2M
    第314场周赛
    5.用户注册_表单验证——使用wtforms-tornado表单数据验证
    45.讲位图:如何实现网页爬虫中的URL去重功能
    云原生服务无状态(Stateless)特性的实现
  • 原文地址:https://blog.csdn.net/hawk2014bj/article/details/139626322
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号