React原理 - React Reconciliation-上

目录

扩展学习资料

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) {// 待更新数+1component._updateBatchNumber = updateBatchNumber + 1;
}

Stack Reconciler-事务性

事务性带来的弊端:

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

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

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

 

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

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

相关文章

spark支持深度学习批量推理

背景 在数据量较大的业务场景中&#xff0c;spark在数据处理、传统机器学习训练、 深度学习相关业务&#xff0c;能取得较明显的效率提升。 本篇围绕spark大数据背景下的推理&#xff0c;介绍一些优雅的使用方式。 spark适用场景 大数据量自定义方法处理、类sql处理传统机器…

环保环卫行业案例 | 燕千云助力高能环境搭建数智化IT服务管理体系及平台

当前环境卫生问题在全球已引起前所未有的关注&#xff0c;而促进健康又成为环境与发展所关注的核心问题。随着数字化时代的到来&#xff0c;环保环卫行业呈现出多个发展趋势&#xff0c;随着业务系统规模的不断扩大&#xff0c;信息系统的运维问题也日益突出&#xff0c;需要得…

『Swift社区赠书第 1 期』- 『循序渐进 Vue.js 3.x 前端开发实战』

文章目录 关于作者内容介绍评论区抽三位小伙伴送书活动时间&#xff1a;截止到 2023-08-24 20:00:00 获奖名单 ps. 文末送书&#xff0c;送书为 Swift社区 额外福利 《循序渐进 Vue.js 3.x 前端开发实战》本书包含 42 集视频教学&#xff0c;完整源代码 PPT 课件。 Vue.js 3…

睿思BI实现杜邦分析

杜邦分析法&#xff08;DuPont analysis&#xff09;是一种分析企业财务状况的方法&#xff0c;得名于美国杜邦公司。该方法可以应用于销售业绩分析。 睿思BI实现杜邦分析效果如下&#xff1a; 效果演示地址&#xff1a;https://www.ruisitech.com/rsbi-ultimate/#/dashboard/…

Zookeeper 入门

第 1 章 Zookeeper 入门 1.1概述 Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff0c;它负责存储和管理大家都关心的数据&#xff0c;然后接受观察者的注册&#xff0c;一旦这些数据的状态发生变化&#xff0c;Zookeeper就将…

Kubernetes技术--k8s核心技术Service服务

1.service概述 Service 是 Kubernetes 最核心概念,通过创建 Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上。 2.service存在的意义 -1:防止pod失联(服务发现) 我们先说一下什么叫pod失联。 -2:

肖sir __linux__面试题和考核05

面试题 1、查看linux中第11行到第20行的数据&#xff08;比如文档a 有30行&#xff09; 方法1&#xff1a;tail -n 11 mm |head -n10 n 表示从第10行开始&#xff0c;取前10行 方法2&#xff1a;head -n -10 mm| tail -n 10 表示从末尾第10行开始&#xff0c;最后10行 方法3&am…

金融风控数据分析-信用评分卡建模(附数据集下载地址)

本文引用自&#xff1a; 金融风控&#xff1a;信用评分卡建模流程 - 知乎 (zhihu.com) 在原文的基础上加上了一部分自己的理解&#xff0c;转载在CSDN上作为保留记录。 本文涉及到的数据集可直接从天池上面下载&#xff1a; Give Me Some Credit给我一些荣誉_数据集-阿里云…

OceanBase安全审计之传输加密

上一期我们讲了关于 OceanBase 安全审计的《身份鉴别》和《用户管理与访问控制》 两个部分&#xff0c;OceanBase 的安全机制介绍其支持传输加密&#xff0c;今天我们主要来实践一下如何配置传输加密以及验证是否真的加密。 作者&#xff1a;金长龙 爱可生测试工程师&#xff0…

K8s:一文认知 CRI,OCI,容器运行时,Pod 之间的关系

写在前面 博文内容整体结构为结合 华为云云原生课程 整理而来,部分内容做了补充课程是免费的&#xff0c;有华为云账户就可以看&#xff0c;适合理论认知&#xff0c;感觉很不错。有需要的小伙伴可以看看&#xff0c;链接在文末理解不足小伙伴帮忙指正 对每个人而言&#xff0c…

【单片机】有人 WH-LTE-7S1 4G cat1 模块连接服务器,教程,记录。GPRS模块连接服务器教程。socket编程。

文章目录 4G cat1 模块封装引脚名称功能拓扑图串口模块调试WH-LTE-7S1公网服务器建立python程序服务服务器程序WH-LTE-7S1 模块连接服务器与多个模块建立TCP长连接的服务器程序 本文主要介绍了一个4G Cat1模块&#xff0c;该模块具有多种功能和特性。文章接下来展示了4G Cat1模…

MySQL connect(使用C、C++链接)

目录 一.Connector/C使用 二.mysql接口 1.初始化mysql_init() 2.链接数据库mysql_real_connect 3.下发mysql命令mysql_query 4.获取执行结果mysql_store_result 5.关闭mysql链接mysql_close 6.事务等操作 7.使用上面接口的总代码 三.实现一个简易mysql客户端 我们无…

「MySQL-04」Linux环境下使用C/C++连接并操纵MySQL

目录 一、准备mysql库&#xff1a;Connector/C 1. 查看是否有mysql相关的库和头文件 2. 安装devel(开发库) 3.到官网下载开发包&#xff0c;并上传到Linux 3.0 须知 3.1 到官网下载开发包 3.2 上传安装包至Linux 二、mysql库&#xff1a;Connector/C 的使用 1. 创建并初始化mys…

CIM和websockt-实现实时消息通信:双人聊天和消息列表展示

欢迎大佬的来访&#xff0c;给大佬奉茶 一、文章背景 有一个业务需求是&#xff1a;实现一个聊天室&#xff0c;我和对方可以聊天&#xff1b;以及有一个消息列表展示我和对方&#xff08;多个人&#xff09;的聊天信息和及时接收到对方发来的消息并展示在列表上。 项目框架概…

CSS中如何实现文字渐变色效果(Text Gradient Color)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 文字渐变色效果&#xff08;Text Gradient Color&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这…

直接插入排序与希尔排序

目录 一&#xff0c;排序的概念 二&#xff0c;插入排序 2.1直接插入排序 2.2 希尔排序 一&#xff0c;排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些或某些关键字的大小&#xff0c;递增或递减的排列 稳定性&#xff…

164到网络安全面试大全(附答案)

最近有不少小伙伴跑来咨询&#xff1a; 想找网络安全工作&#xff0c;应该要怎么进行技术面试准备&#xff1f;工作不到 2 年&#xff0c;想跳槽看下机会&#xff0c;有没有相关的面试题呢&#xff1f; 为了更好地帮助大家高薪就业&#xff0c;今天就给大家分享两份网络安全工…

Mysql批量插入大量数据的方法

使用存储过程进行插入&#xff0c; 在navicate中示例如下&#xff1a; 输入需要的参数点击完成 在begin end中输入代码&#xff0c;示例代码如下 CREATE DEFINERskip-grants userskip-grants host PROCEDURE batch_insert() BEGINdeclare i int default 0; set i0;while i<1…

银行测试能不能长期做下去呢?

银行测试是一个相对稳定的领域&#xff0c;因为银行作为金融机构必须遵守法律法规&#xff0c;要求其业务的安全性、可靠性和稳定性等方面都需要不断地测试和验证。因此从长远来看&#xff0c;银行测试有着相对较好的就业前景。 当然&#xff0c;随着技术的发展和变化&#xf…

数学建模:拟合算法

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 数学建模&#xff1a;拟合算法 文章目录 数学建模&#xff1a;拟合算法拟合算法多项式拟合非线性拟合cftool工具箱的使用 拟合算法 根据1到12点间的温度数据求出温度与时间之间的近似函数关系 F ( t ) F(…