React原理 - React Reconciliation-上

news2024/11/20 14:42:49

目录

扩展学习资料

React Reconciliation

Stack Reconciler【15版本、栈协调】

Stack Reconciler-事务性

事务性带来的弊端:


扩展学习资料

名称

链接

备注

官方文档

Reconciliation – React

英文

stack reconciler

Implementation Notes – React

英文

react fiber

What is React Fiber ? | Giamir Buoncristiani

英文

React Fiber 初探

React Fiber 初探 - 掘金

React Fiber 架构

React Fiber架构 - 知乎

react协调:Virtual Dom转化成真实UI的过程

React Reconciliation

主要协调方式:

  • Stack Reconciler【15版本、栈协调】
  • Fiber Reconciler【16版本、Fiber协调】

Stack Reconciler【15版本、栈协调】

React的初次渲染

  • 这是一个很简单的demo,定义了组件App,输出一段文本。
  • 里面依赖渲染state的变量text,在这里我们先用文本替代。
class App extends React.Component {
  render() { 
    const {text} = this.state;
    return <div className='app'>react 15.6.2 first render</div>;
  }
}

代码图示

.jsx文件通过babel转义调用react的createElement

  • lib/ReactMount.js中申明了render方法,其实现如下:
//                即将渲染的组件,挂载节点, 回调函数
render: function (nextElement, container, callback) {
    return ReactMount._renderSubtreeIntoContainer(null, nextElement, container, callback)
}
  • _renderSubtreeIntoContainer 方法是渲染子树到container节点里面的,container是我们在html定义的根节点。
var component = ReactMount._renderNewRootComponent(nextWrappedElement, container, shouldReuseMarkup, nextContext)
._renderedComponent.getPublicInstance();
  • lib/ReactMount.js基本上就是React第一次渲染的完整过程体现,里面会引用很多辅助模块。renderNewRootComponent中关键代码:
// 初始化React组件的方法
var componentInstance = instantiateReactComponent(nextElement, false);
  • 生成根组件实例之后就开始渲染,该组件实例是挂载根组件的实例,instantiateReactComponent方法就是接受一个React节点,返回一个挂载的实例。
instance = new ReactCompositeComponentWrapper(element);
// react所有组件包装器,继承了react所有组件
  • ReactCompositeComponent类就是React中组件的组合,包含了React的组件类别,以及React组件的声明周期函数挂载。
  • batchedMountComponentIntoNode方法执行批量挂载。
  • mountComponentIntoNode方法执行组件挂载。
var CompositeTypes = { // 对react组件进行收敛,通过传进的类型,进行组件类型判断
    ImpureClass: 0,
    PureClass: 1,
    StatelessFunctional: 2
};
//					组件渲染到dom的重要方法
var markup = ReactReconciler.mountComponent(wrapperInstance, transaction, null, 
ReactDOMContainerInfo(wrapperInstance, container), context, 0 /* parentDrbugID */);
// 批量挂载
// batchedMountComponentIntoNode(markup)
// 组件挂载到html节点
// mountComponentIntoNode(markup)
  • mountComponent方法最后会调用_mountImageIntoNode方法,作用是把前面产生的‘markup’渲染到HTML节点中去。
  • _mountImageIntoNode中由于是第一次渲染节点,所以会执行insertTreeBefore方法。insertTreeBefore就是最底层的DOM API执行插入HTML节点。
ReactMount._mountImageIntoNode(markup, container, wrapperInstance, shouldReuseMarkup, transaction);
DOMLazyTree.insertTreeBefore(container, markup, null);
// 最底层的DOM  API执行插入/更新HTML节点
  • setState
1. enqueueSetState setState 常规的调用执行函数
2. enqueueCallback setState 带回调函数的执行函数
  • componentWillReceiveProps
通常props发生改变,也会触发再次渲染,不过更多的处理逻辑是在
componentWillReceiveProps里面执行一些逻辑判断,最后执行this.setState方法

enqueueUpdate

  • enqueueUpdate判断当前是否在更新中。如未更新,则dirtyComponents会将当前component加入到数组中。
  • 如isBatchingUpdates为true,页面不会立刻触发批量更新。
  • 侧面反映setState调用后不会立即执行更新,所以在setState之后立即取值state,还会是之前的值。
if(!batchingStrategy.isBatchingUpdates) {// 通常会是true,所以setState是异步
    batchingStrategy.batchedUpdates(// 更新策略-批量更新
        enqueueUpdate,// 更新队列
        component,    // 更新组件 
    );
    return;
}
// 待更新,组件数组
dirtyComponents.push(component);
if (component._updateBatchNumber == null) {
    // 待更新数+1
    component._updateBatchNumber = updateBatchNumber + 1;
}

Stack Reconciler-事务性

事务性带来的弊端:

由事务性导致它的更新是一气呵成的,在组件比较复杂,耗时比较长的时候,与此同时,如果有用户输入、点击。【浏览器没有将这些事件定义为高优先级,一视同仁】就会比较卡顿,因为大部分运算还是在处理更新渲染。【渲染过程不可阻断,一旦页面更新过于复杂,耗时过长,页面操作就会卡顿】

setState是大部分情况是异步的【onClick,onChange,组件生命周期调用】

setState不处于事务性更新过程时,是同步的【新的更新周期时是立刻执行的】

 

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

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

相关文章

IntelliJ IDEA 2023.2.1使用Git时弹出“使用访问令牌登录”问题解决

这里写目录标题 一、内网Git环境GitLabGogsGitea 二、外网Git环境GitHubGitee 升级为IntelliJ IDEA 2023.2.1后&#xff0c;使用Git时弹出“使用访问令牌登录”的窗口&#xff0c;习惯使用Git帐号密码登录的用户&#xff0c;面对这个突如其来的弹窗真的很懵。 一、内网Git环境 …

虚拟化技术原理

计算虚拟化 介绍 把物理主机上物理资源&#xff08;CPU&#xff0c;内存&#xff0c;IO外设&#xff09;&#xff0c;通过虚拟化层抽象成超量、等量的逻辑资源&#xff08;虚拟CPU&#xff0c;虚拟内存&#xff0c;虚拟IO设备&#xff09;&#xff0c;然后重新组合形成新的虚…

大数据学习:impala基础

impala基础 1. impala介绍 1.1 impala概述 Impala是Cloudera公司推出&#xff0c;提供对HDFS、Hbase数据的高性能、低延迟的交互式SQL查询功能。官方测试性能比hive快10到100倍&#xff0c;其sql查询比sparkSQL还要更加快速&#xff0c;号称是当前大数据领域最快的查询sq工具…

【排序】快排非递归

模拟递归的下标&#xff0c;让他们入栈

投票同款特效样式

先看效果&#xff1a; 再看代码&#xff08;查看更多&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>import url("https://fonts.…

vant2 van-calendar组件增加清除按钮和确定按钮

利用自定义插槽增加一个清除按钮 <van-calendar ref"fTime1" select"selectTimePicker" confirm"changeTimePicker" :default-date"null" :show-confirm"false" v-model"timePickerShow" type"range&quo…

《用行动打造满意的服务》考试答案

中电金信新员工入职培训选修课程《用行动打造满意的服务》考试答案

数据结构day08(树、算法)

今日任务&#xff1a; 二叉树&#xff1a; 今日思维导图 链接&#xff1a; 快排&#xff1a;快速排序法&#xff08;详解&#xff09;_李小白~的博客-CSDN博客图画挺好啊 常见款&#xff1a;https://www.runoob.com/w3cnote/quick-sort.html

18.2 【Linux】rsylog.service:记录登录文件的服务

rsyslogd 可以负责主机产生的各个信息的登录&#xff0c;而这些信息本身是有“严重等级”之分的。每个 Linux distributions 放置的登录文件文件名可能会有所差异。 基本上&#xff0c; rsyslogd 针对各种服务与讯息记录在某些文件的配置文件就是 /etc/rsyslog.conf&#xff0…

掌握逻辑漏洞复现技术,保护您的数字环境

环境准备 这篇文章旨在用于网络安全学习&#xff0c;请勿进行任何非法行为&#xff0c;否则后果自负。 1、支付逻辑漏洞 攻击相关介绍 介绍&#xff1a; 支付逻辑漏洞是指攻击者利用支付系统的漏洞&#xff0c;突破系统的限制&#xff0c;完成非法的支付操作。攻击者可以采…

c# - - - 安装.net core sdk

如图&#xff0c;安装的是.Net Core 2.2版本 查看安装成功

游戏报错xinput1_3.dll丢失的解决方法,xinput1_3.dll修复步骤

今天&#xff0c;我将和大家探讨一个与我们日常生活息息相关的话题——电脑丢失xinput1_3.dll文件怎么办。作为一位老师&#xff0c;我深知电脑技术对于现代人的重要性&#xff0c;而xinput1_3.dll文件的丢失则是许多电脑用户在游戏、办公等方面遇到的问题。因此&#xff0c;我…

android开发google账号一键登录和注册

一、官网的使用说明 开始使用一键登录和注册 | Authentication | Google for Developers 二、先到API控制台注册应用添加web应用凭证&#xff0c;注意一定是web应用凭证&#xff0c;如果用android凭证使用时会报错“10: Developer console is not set up correctly”不知…

排序之插入排序

文章目录 前言一、直接插入排序1、基本思想2、直接插入排序的代码实现3、直接插入排序总结 二、希尔排序1、希尔排序基本思想2、希尔排序的代码实现3、希尔排序时间复杂度 前言 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大…

【STM32单片机】FATS文件系统,写入字符串到文件,读取文件内容

基于正点原子的库函数版本的FATS文件系统&#xff0c;实现向文件写入字符串&#xff0c;读取文件内容&#xff0c;这里是指txt文件&#xff0c;其余文件其实也一样&#xff0c;读取成字节。 #include "led.h" #include "delay.h" #include "sys.h&qu…

IDEA 性能优化

前言 IDEA 基于JVM&#xff0c;是内存紧张型的应用&#xff0c;即使是16GB内存也很一般。 机器配置&#xff1a; win10 proi7-4720hq 3.2G 4c8tddr3-1600IDEA 2023.2.1 本文优化在不升级硬件的前提下使用 优化 调整JVM堆内存及GC IDEA 自身的JVM运行时配置&#xff0c;启动…

【日积月累】后端刷题日志

刷题日志 说说对Java的理解JAVA中抽象类和接口之间的区别Java中的泛型 和equals()的区别八种基本数据类型与他们的包装类在一个静态方法内调用一个非静态成员为什么是非法的静态方法与实例方法有何不同重载与重写深拷贝浅拷贝面向过程与面向对象成员变量与局部变量Spring框架Sp…

C++-list实现相关细节和问题

前言&#xff1a;C中的最后一个容器就是list&#xff0c;list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指…

机器学习和数据挖掘02-Gaussian Naive Bayes

概念 贝叶斯定理&#xff1a; 贝叶斯定理是概率中的基本定理&#xff0c;描述了如何根据更多证据或信息更新假设的概率。在分类的上下文中&#xff0c;它用于计算给定特征集的类别的后验概率。 特征独立性假设&#xff1a; 高斯朴素贝叶斯中的“朴素”假设是&#xff0c;给定…

库仑定律和场强

1、库伦定律 两个电荷相互作用的力。 力是矢量&#xff0c;有大小和方向。 1.1、力的大小 1.2、力的方向 在两个电荷的连线上&#xff0c;同种电荷相互排斥&#xff0c;异种电荷相互吸引。 真空&#xff0c;不是必要条件&#xff0c;修改公式中介电常数的值仍然满足库伦定律。…