【React】原理

news2024/11/16 3:46:08

笔记来源:小满zs

虚拟 DOM

在这里插入图片描述

// react.js
// jsx => babel | swc => React.createElement
const React = {
    createElement(type, props, ...children) {
        return {
            type,
            props: {
                ...props,
                children: children.map(child => typeof child === 'object' ? child : React.createTextElement(child))
            }
        }
    },
    createTextElement(text) {
        return {
            type: 'TEXT_ELEMENT',
            props: {
                nodeValue: text,
                children: []
            }
        }
    },
}

// 测试 vDOM
const vDOM = React.createElement('div', { id: 'foo' }, React.createElement('span', null, 'bar'))
console.log("=>(react.js:24) vDOM", vDOM);
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="root"></div>
<script src="./react.js"></script>
</body>
</html>

在这里插入图片描述

任务切片

浏览器一帧为60FPS,也就是16ms(1000毫秒/60帧≈16.67毫秒)。

浏览器一帧完成的任务:

  1. 处理事件的回调click.…事件
  2. 处理计时器的回调
  3. 开始帧
  4. 执行 requestAnimationFrame 动画的回调
  5. 计算机页面布局计算(DOM)合并到主线程
  6. 绘制
  7. 如果此时还有空闲时间,执行 requestldleCallback(React 使用了该函数的思想,React 自己又实现了 requestldleCallback)
// 完成虚拟 DOM 转 fiber 结构和时间切片
let nextUnitOfWork = null
function workLoop(deadline) {
    let shouldYield = false
    while (nextUnitOfWork && !shouldYield) {
        nextUnitOfWork = performUnitOfWork(nextUnitOfWork)
        shouldYield = deadline.timeRemaining() < 1
    }
    requestIdleCallback(workLoop)
}

requestIdleCallback(workLoop) 

function performUnitOfWork() {

}

对任务切片可以简单理解为 将所有的任务分成一个一个小任务,这里小任务函数都放在 requestIdleCallback 中,先执行优先级高的小任务,每一帧执行一个小任务,直到将所有小任务执行完毕。

待完成~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法揭秘:时间复杂度与空间复杂度的实用指南

在我们编程的过程中&#xff0c;算法是解决问题的核心。而在评估算法的优劣时&#xff0c;时间复杂度和空间复杂度是两个不可或缺的概念。无论你是刚入门的编程小白&#xff0c;还是希望深入了解的学习者&#xff0c;理解这两个概念都能帮助你写出更高效的代码。今天&#xff0…

一步到位的智慧:BI可视化大屏在复杂环境中如何精准拾取目标

在可视化设计器中实现良好的组件拾取功能&#xff0c;是提升用户体验和设计效率的关键。它们不仅能够提升用户体验和操作效率&#xff0c;还能够增强设计的灵活性和精度&#xff0c;促进设计创新&#xff0c;并最终提升设计的质量和价值。因此&#xff0c;在可视化设计过程中&a…

【leetcode】环形链表、最长公共前缀

题目&#xff1a;环形链表 解法一&#xff1a;哈希表 创建一个哈希表&#xff0c;遍历链表先判断哈希表中是否含有要放入哈希表中的节点&#xff0c;如果该节点已在哈希表中出现那么说明该链表是环形的&#xff1b;如果链表节点出现nullptr那么就退出循环&#xff0c;该链表是…

AI美女横扫小红书:虚拟魅力如何颠覆网红时代?真真假假难辨,但是一样美!

最近&#xff0c; 关于AI美女在小红书上“屠版”的消息引发了广泛讨论。根据一位网友的群聊记录&#xff0c;他声称利用文生图模型生成AI美女图片&#xff0c;并通过账号矩阵管理软件操控了1327个小红书账号&#xff0c;成功将平台“屠版”。 更令人惊讶的是&#xff0c;小红…

React-Native 中使用 react-native-image-crop-picker 在华为手机上不能正常使用拍照功能

背景: React-Native 0.66 中使用 react-native-image-crop-picker 在安卓 华为手机上不能正常使用拍照功能, 其他品牌正常 代码如下: import ImagePicker from react-native-image-crop-picker;ImagePicker.openCamera(photoOptions).then(image > {callback(image);}) …

html+css(如何用css做出京东页面,静态版)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>京东</title><link rel"stylesheet&q…

对c语言中的指针进行深入全面的解析

1.普通的指针: 实际上指针就是存放地址的变量&#xff0c;eg: int a10; int *p&a; 拆分一下int *中的*说明p是一个指针&#xff0c;int是它所指向的类型&#xff1b; 2.字符串指针和字符串数组 char*str1"abcd"; 先看这一个&#xff0c;这个就是一个字符串…

振弦式渗压计智慧水利工程 适用恶劣环境有保障

产品概述 振弦式渗压计适合埋设在水工建筑物和基岩内&#xff0c;或安装在测压管、钻孔、堤坝、管道或压力容器中&#xff0c;以测量孔隙水压力或液位。主要部件均采用特殊钢材制造&#xff0c;适合在各种恶劣环境中使用。特殊的稳定补偿技术使传感器具有极小的温度补偿系数。…

量产AI美女?一文讲清“数字尤物”背后的AI绘画的商机

这些AI美女都有刷到过吧&#xff1f;从国外Youtube的视频封面图的丰满hotgirl&#xff0c;到小红书笔记各式风格数字尤物&#xff0c;都已悄咪咪混入我们的社交媒体,而且“她们”的伪装技能越发满级! 更多实操教程和AI绘画工具&#xff0c;可以扫描下方&#xff0c;免费获取 本…

(undone) 声音信号处理基础知识(10) (Demystifying the Fourier Transform: The Intuition)

参考&#xff1a;https://www.youtube.com/watch?vXQ45IgG6rJ4 FT 可以把时域信息转为频域信息 以下是对于 FT 的一些 intuition-level 的理解&#xff1a; 1.FT 会把原始信号跟不同频率的一系列正弦波对比 2.对于每一个正弦波频率&#xff0c;我们会得到一个标量 和 一个相…

Unreal Engine 5 C++: 编辑器工具编写入门01(中文解释)

目录 准备工作 1.创建插件 2.修改插件设置 快速资产操作&#xff08;quick asset action) 自定义编辑器功能 0.创建编辑器button&#xff0c;测试debug message功能 大致流程 详细步骤 1.ctrlF5 launch editor 2.创建新的cpp class&#xff0c;derived from AssetAction…

Vue中nextTick的底层原理

Vue中nextTick的底层原理 前言一、异步更新队列二、前置知识2.1 JS 运行机制2.2 异步任务的类型 三、nextTick 实现原理3.1 Vue.nextTick 内部逻辑3.2 vm.$nextTick 内部逻辑3.3 源码解读3.4 为什么优先使用微任务&#xff1a; 前言 知其然且知其所以然&#xff0c;Vue 作为目…

UWB为什么是首选的室内定位技术

超宽带 (UWB) 是一种基于 IEEE 802.15.4a 和 802.15.4z 标准的无线通信技术&#xff0c;能够非常准确地测量无线电信号的飞行时间&#xff0c;从而实现厘米级精度的距离/位置测量。 除了这一独特功能外&#xff0c;UWB 还提供数据通信能力&#xff0c;且功耗极低&#xff0c;使…

【包教包会】CocosCreator3.x框架——音频模块(无需导入、无需常驻节点)

下载地址&#xff1a;AudioDemo3.x: CocosCreator3.x框架——音频模块 注意事项&#xff1a; 1、gi.musicPlay、gi.soundPlay是同步函数&#xff0c;使用前必须先将音频加载到缓存 Demo通过SceneLoading实现了一个极简的Loading页面&#xff0c;将音频全部加载后进入游戏&…

【Qt笔记】QStackedWidget控件详解

目录 引言 一、基础功能 二、属性设置 2.1 属性介绍 2.2 代码示例 2.3 代码解析 三、常用API 3.1 添加子部件 3.2 插入子部件 3.3 移除子部件 3.4 设置当前页面索引值 3.5 设置当前显示子部件 3.6 返回索引处子部件指针 3.7 返回子部件索引值 四、信号与槽 4.…

device靶机详解

靶机下载地址 https://www.vulnhub.com/entry/unknowndevice64-1,293/ 靶机配置 主机发现 arp-scan -l 端口扫描 nmap -sV -A -T4 192.168.229.159 nmap -sS -Pn -A -p- -n 192.168.229.159 这段代码使用nmap工具对目标主机进行了端口扫描和服务探测。 -sS&#xff1a;使用…

C++存储数据单位转换输出字符串

C封装存储数据单位转换, 方便将输入数据以指定方式输出 main.cpp #include <wtypesbase.h> #include <string> #include <vector> #include <tchar.h>#ifdef _UNICODE using _tstring std::wstring; #else using _tstring std::string; #endif// 数…

typename、非类型模板参数、模板参数的特化、模板类成员函数声明和定义分离、继承等的介绍

文章目录 前言一、typename二、非类型模板参数三、模板参数的特化1. 函数模板参数的特化2. 类模板的特化 四、模板类成员函数声明和定义分离1. 显示实例化&#xff08;不建议使用&#xff09;2. 将生命和定义写在同一个.h文件中 五、 继承总结 前言 typename、非类型模板参数、…

解析rss链接数据,来长期把某博客数据订阅到自己的网站

目的 当我们打开这个订阅链接&#xff0c;会看到我们的文章信息以xml的形式呈现到浏览器页面中&#xff0c;怎么直接在我们自己的网站中&#xff0c;将这个链接的数据转为我们熟悉的json数据&#xff0c;然后渲染到自己的网站中呢 技术栈 react hookstypescriptwebpack 核心…

【SemeDrive】【X9HP】【PTG4.3】解决Partition Flash Error及PTG4.3二级分区烧录与升级问题

前言&#xff1a;PTG4.1 之前的版本使用的都是普通 emmc 和 一级分区表&#xff0c;PTG4.3 新增了 virtio-eMMC 功能和二级分区表的设置&#xff0c;因此关于 PTG4.3 的烧录和升级有以下几个疑问和解答。 一、名词解释 virtio-eMMC&#xff1a;基于 Virtio 框架的虚拟化 EMMC…