深度解析react中hooks的底层原理是啥?React架构原理深度解析

1.React Hooks 底层原理

React Hooks 的底层原理是基于 React Fiber 架构的实现。下面是对 React Hooks 底层原理的深度解析:

  1. Fiber 架构
    React Fiber 是 React 的新的协调引擎,它的设计目标是支持增量式更新优先级调度暂停和继续执行等特性。Fiber 架构重新实现了 React 的调度算法,使得 React 可以更灵活地控制组件的渲染过程。

    我们都知道react框架的核心算法是diff算法的,其实 diff 算法的核心就是复用节点,通过一一对比也好,通过 map 查找也好,都是为了找到可复用的节点,移动过来。然后剩下的该删删该增增。在 16 之后,为了优化性能,会先把 vdom 转换成 fiber,也就是从树转换成链表,然后再渲染。整体渲染流程分成了两个阶段:

    render 阶段:从 vdom 转换成 fiber,并且对需要 dom 操作的节点打上 effectTag 的标记
    commit 阶段:对有 effectTag 标记的 fiber 节点进行 dom 操作,并执行所有的 effect 副作用函数。

从 vdom 转成 fiber 的过程叫做 reconcile(调和),这个过程是可以打断的,由 scheduler 调度执行。第一次渲染不需要 diff,直接 vdom 转 fiber。再次渲染的时候,会产生新的 vdom,这时候要和之前的 fiber 做下对比,决定怎么产生新的 fiber,对可复用的节点打上修改的标记,剩余的旧节点打上删除标记,新节点打上新增标记。

  1. Hooks 的调度和状态管理
    React Hooks 的核心思想是在函数组件中引入状态和副作用的管理。Hooks 的使用不依赖于 class 组件,它们是通过调用 React 内部的底层 API 来实现的。Hooks 在函数组件中引入了 useStateuseEffectuseReducer 等钩子函数,这些钩子函数允许在函数组件中使用状态和副作用。

  2. Hooks 实现原理
    Hooks 的实现基于 React Fiber 的调度机制和组件树的遍历。当函数组件被调用时,React 会创建一个 Fiber 节点来表示该组件,并将其添加到 Fiber 树中。Hooks 的状态管理和副作用逻辑被存储在 Fiber 节点中,并在组件的每次渲染中被调用。

  3. Hooks 的规则
    React Hooks 有一些规则和约束,这些规则保证了 Hooks 的正确使用和执行顺序:

    • Hooks 只能在函数组件的顶层使用,不能在循环、条件语句或嵌套函数中使用。
    • Hooks 的调用顺序必须保持一致,不能在条件语句中或循环中调用 Hooks。
    • Hooks 的调用不能出现在任何 JavaScript 函数中,而是在 React 函数组件中调用。
  4. Hooks 的优势

    • 使函数组件具备了状态和副作用管理的能力,不再依赖于类组件。
    • 更容易共享状态逻辑,实现逻辑的复用。
    • 使得 React 组件更加简洁和易于理解。

总的来说,React Hooks 的底

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

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

相关文章

FFmpeg开发笔记(十)Linux环境给FFmpeg集成vorbis和amr

FFmpeg内置了aac音频格式,在《FFmpeg开发实战:从零基础到短视频上线》一书的“5.2.2 Linux环境集成mp3lame”又介绍了如何给FFmpeg集成mp3格式,常见的音频文件除了这两种之外,还有ogg和amr两种格式也较常用。其中ogg格式的编解码…

【C++庖丁解牛】vector容器的简易模拟实现(C++实现)(最后附源码)

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 前言vector容器代码实现内…

前端JavaScript篇之常见事件

目录 JavaScript常见事件click(点击)mouseover(鼠标悬停)keydown(按键按下)load(加载)submit(提交) JavaScript常见事件 JavaScript中的事件是指用户与网页元…

python基础13_字符编码

什么是字符编码呢? 在讲字符编码的之前,我先讲一个东西叫字符集 什么是字符集呢? python默认的字符集unicode 很简单,就是他把大部分国家的文字,符号,都集合过来,每一个文字或者说是符号都有一个编号去代表 你可以理解成高考 每个考生的准考证号,就代表这个学生 那么字…

JVM垃圾收集器-serial.parNew,parallelScavnge,serialOld,parallelOld,CMS,G1

垃圾收集器 分代模型 适用于新生代: serial parNew parallel Scaavenge 适用于老年代: CMS serial Old(msc) paraller Old 分区模型 适用于超大容量: G1 分代模型 serial /serial Old收集器 1.单线程收集器 2.收集时会暂停其他线程&…

剑指offer C ++双栈实现队列

1. 基础 队列:先进先出,即插入数据在队尾进行,删除数据在队头进行; 栈:后进先出,即插入与删除数据均在栈顶进行。 2. 思路 两个栈实现一个队列的思想:用pushStack栈作为push数据的栈&#xff…

使用canvas绘制超炫时钟

HTML5 Canvas相当于一个画板,你可以在Canvas绘制任意的东西,今天要分享一款利用HTML5 Canvas绘制的超炫时钟的方法及代码,非常的漂亮,这里推荐给大家 代码地址 使用canvas绘制超炫时钟

react中JSX的详解

目录 JSX的本质及其与JavaScript的关系探究 一、JSX的本质 二、JSX与JavaScript的关系 三、为什么要使用JSX 四、不使用JSX的后果 五、JSX背后的功能模块 JSX的本质及其与JavaScript的关系探究 在React开发中,JSX是一个不可或缺的部分。那么,JSX的…

LeetCode102题:二叉树的层序遍历(python3)

代码思路:使用队列先进先出的特性,queue[]不为空进入for循环,tmp存储每层的节点,将结果添加至res[]中。 python中使用collections中的双端队列deque(),其popleft()方法可达到O(1)时间复杂度。 class Solution:def lev…

5.62 BCC工具之cpudist.py解读

一,工具简介 cpudist会将任务在CPU上的时间汇总为直方图,显示任务在被取消调度之前在CPU上花费的时间。这提供了有价值的信息,可以指示过度订阅(处理器太少而任务太多)、由于过多上下文切换而产生的开销(例如,多个线程共用的常见锁)、工作负载分布不均、任务过于细化等…

数据结构 第1章:绪论

文章目录 1. 绪论1.1. 数据结构 1.2. 算法1.2.1. 算法的基本概念1.2.2. 算法的时间复杂度1.2.3. 算法的空间复杂度 1. 绪论 程序 数据结构 算法 1.1. 数据结构 数据:是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理…

【机器学习300问】33、决策树是如何进行特征选择的?

还记得我在【机器学习300问】的第28问里谈到的,看决策树的定义不就是if-else语句吗怎么被称为机器学习模型?其中最重要的两点就是决策树算法要能够自己回答下面两问题: 该选哪些特征 特征选择该选哪个阈值 阈值确定 今天这篇文章承接上文&…

神经网络中的先验知识

单调性约束: 单调性约束对于某些问题非常关键,可以确保模型输出与输入的关系保持单调。在我的实践中,我发现通过引入这种约束,能够有效提高模型的性能,特别是在需要保持某些顺序关系的任务上。 平滑性约束&#xff1a…

探秘高校线上心理咨询室:Java+SpringBoot的实践

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

蓝桥·算法双周赛|第七场分级赛——小白入门赛

&#x1f525;博客介绍&#xff1a; 27dCnc &#x1f3a5;系列专栏&#xff1a; <<数据结构与算法>> << 算法入门>> << C项目>> &#x1f3a5; 当前专栏: << 算法入门>> 专题 : 数据结构帮助小白快速入门算法 &#x1f4…

解锁Redis宝藏:探索Redis哈希(Hash)的神奇世界!

Redis 哈希(Hash)是一种灵活且功能强大的数据结构&#xff0c;它可以存储多个字段和对应的值&#xff0c;适用于存储对象。了解 Redis 哈希的基本命令、示例和使用方法&#xff0c;以及常见的应用场景&#xff0c;将帮助您更好地利用 Redis 的强大功能。 Redis 哈希的基本命令…

AI辅助研发正在成为造福人类的新生科技力量

目录 1.AI用于药物研发 &#xff08;1&#xff09;药物靶点预测&#xff1a; &#xff08;2&#xff09;药物分子设计&#xff1a; &#xff08;3&#xff09;药物筛选&#xff1a; &#xff08;4&#xff09;药效和安全性预测&#xff1a; &#xff08;5&#xff09…

C#四部曲(知识补充)

Unity跨平台原理 .Net相关 只要编写的时候遵循.NET的这些规则&#xff0c;就能在.NET平台下通用 各种源码→根据.NET规范编写→(虚拟机)生成CIL中间码(保存在程序集中)→转成操作系统原代码 跨语言← 跨平台↓ Unity跨平台原理&#xff08;Mono&#xff09; c#脚本→MonoC#编…

CCCorelib 点云曲面特征(CloudCompare内置算法库)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里基于每个点的邻域协方差来获取点云中具有的曲面几何特征的点,计算方式如下图所示: 二、实现代码 // CloudCompare #include <CCCoreLib/PointCloudTpl.h> #include <CCCoreLib/

QT6.6下android编译及调用自定义so库方法

一.问题概述 最近需要把QT程序从5.12的桌面环境移植到QT6.6的android下,项目中有很多DLL库要重新编译为so文件,移植到android环境然后调用,中间有很多坑,虽然大体和桌面系统用法相同,但细节上还是有区别的,尤其是so库的调用方法上,过程中也是debug了两天才解决,如果你也…