当前位置: 首页 > news >正文

React16源码: React中的completeWork对HostText处理含更新的源码实现

HostText


1 )概述

  • completeWork 中 对 HostText的处理
  • 在第一次挂载和后续更新的不同条件下进行操作
    • 第一次挂载主要是创建实例
    • 后续更新其实也是重新创建实例

2 )源码

定位到 packages/react-reconciler/src/ReactFiberCompleteWork.js#L663

case HostText 这里

case HostText: {let newText = newProps;// 符合这个条件,说明它不是第一次渲染,就是更新的状态// 调用 updateHostText 进行更新if (current && workInProgress.stateNode != null) {const oldText = current.memoizedProps;// If we have an alternate, that means this is an update and we need// to schedule a side-effect to do the updates.updateHostText(current, workInProgress, oldText, newText);} else {// 对于第一次渲染if (typeof newText !== 'string') {invariant(workInProgress.stateNode !== null,'We must have new props for new mounts. This error is likely ' +'caused by a bug in React. Please file an issue.',);// This can happen when we abort work.}// 跳过 context 处理const rootContainerInstance = getRootHostContainer();const currentHostContext = getHostContext();// 跳过 hydrate 处理let wasHydrated = popHydrationState(workInProgress);if (wasHydrated) {if (prepareToHydrateHostTextInstance(workInProgress)) {markUpdate(workInProgress);}} else {// 创建 文本 实例workInProgress.stateNode = createTextInstance(newText,rootContainerInstance,currentHostContext,workInProgress,);}}break;
}
  • 进入 updateHostText

    updateHostText = function(current: Fiber,workInProgress: Fiber,oldText: string,newText: string,
    ) {// 这个非常简单,通过前后 text 是否有区别// 如果不同,则创建新的 text实例if (oldText !== newText) {// If the text content differs, we'll create a new text instance for it.// 先跳过 context 的处理const rootContainerInstance = getRootHostContainer();const currentHostContext = getHostContext();workInProgress.stateNode = createTextInstance(newText,rootContainerInstance,currentHostContext,workInProgress,);// We'll have to mark it as having an effect, even though we won't use the effect for anything.// This lets the parents know that at least one of their children has changed.markUpdate(workInProgress);}
    };
    
    • 进入 createTextInstance
      // packages/react-dom/src/client/ReactDOMHostConfig.js#L272
      export function createTextInstance(text: string,rootContainerInstance: Container,hostContext: HostContext,internalInstanceHandle: Object,
      ): TextInstance {if (__DEV__) {const hostContextDev = ((hostContext: any): HostContextDev);validateDOMNesting(null, text, hostContextDev.ancestorInfo);}const textNode: TextInstance = createTextNode(text, rootContainerInstance);// 这个方法之前阅过precacheFiberNode(internalInstanceHandle, textNode);return textNode;
      }
      
      • 进入 createTextNode
        export function createTextNode(text: string,rootContainerElement: Element | Document,
        ): Text {// 最终 getOwnerDocumentFromRootContainer 这里返回一个dom对象,调用dom的 createTextNode 这个方法return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text,);
        }
        
        • 进入 getOwnerDocumentFromRootContainer
        function getOwnerDocumentFromRootContainer(rootContainerElement: Element | Document,
        ): Document {// rootContainerElement.ownerDocument 这里是 window.document 对象// 这么做是为了兼容多平台api的使用return rootContainerElement.nodeType === DOCUMENT_NODE? (rootContainerElement: any): rootContainerElement.ownerDocument;
        }
        
  • HostText 相比于 HostComponents 来说,它没有多种选择

  • 没有各种各样的属性,整体来说非常的简单

  • 一些特别说明的,写在了上述代码注释中

相关文章:

React16源码: React中的completeWork对HostText处理含更新的源码实现

HostText 1 )概述 在 completeWork 中 对 HostText的处理在第一次挂载和后续更新的不同条件下进行操作 第一次挂载主要是创建实例后续更新其实也是重新创建实例 2 )源码 定位到 packages/react-reconciler/src/ReactFiberCompleteWork.js#L663 到 c…...

网络协议与攻击模拟_07UDP协议

一、简单概念 1、UDP协议简介 UDP(用户数据报)协议,是传输层的协议。不需要建立连接,直接发送数据,不会重新排序,不需要确认。 2、UDP报文字段 源端口目的端口UDP长度UDP校验和 3、常见的UDP端口号 5…...

生命在于折腾——WeChat机器人的研究和探索

一、前言 2022年,我玩过原神,当时看到了云崽的QQ机器人,很是感兴趣,支持各种插件,查询游戏内角色相关信息,当时我也自己写了几个插件,也看到很多大佬编写的好玩的插件,后来因为QQ不…...

融资项目——EasyExcel将Excel文件保存至数据库

上一篇博客已经基本介绍了EasyExcel的配置与基本使用方法。现在准备使用EasyExcel将Excel文件保存至数据库。 1.由于我们想每读取Excel中的N条记录后将这些记录全部写入数据库中。所以首先我们在Mybatis文件内先要写一个批量保存Excel文件中的记录的sql语句。 <insert id&q…...

【Oracle】设置FGA(Fine-Grained Audit)细粒度审计

文章目录 【Oracle】设置FGA(Fine-Grained Audit)细粒度审计参考 【声明】文章仅供学习交流&#xff0c;观点代表个人&#xff0c;与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) 收集Oracle数据库内存相关的信息 【Oracle】ORA-32017和ORA-00384错误处理 【Oracle】设…...

js vue调用activex ocx

js vue调用activex ocx 与IE调用方式不同处 CLSID和TYPE <OBJECT id"MultiplyDemo" refocx1 CLSID"{8EEF7302-1FC8-4BA0-8EA5-EC29FDBCA45B}" TYPE"application/x-itst-activex" width15% height15%></OBJECT>//调用方式1 //或是 …...

Hbas简介:数据模型和概念、物理视图

文章目录 说明零 BigTable一 Hbase简介二 HBase 访问接口简介三 行式&列式存储四 HBase 数据模型4.1 HBase 列族数据模型4.2 数据模型的相关概念4.3 数据坐标 五 概念&物理视图 说明 本文参考自林子雨老师的大数据技术原理与应用(第三版)教材内容&#xff0c;仅供学习…...

uniapp css样式穿透

目录 前言css样式穿透方法不加css样式穿透的代码加css样式穿透的代码不加css样式穿透的代码 与 加css样式穿透的代码 的差别参考 前言 略 css样式穿透方法 使用 /deep/ 进行css样式穿透 不加css样式穿透的代码 <style>div {background-color: #ddd;} </style>…...

【立创EDA-PCB设计基础完结】7.DRC设计规则检查+优化与丝印调整+打样与PCB生产进度跟踪

前言&#xff1a;本文为PCB设计基础的最后一讲&#xff0c;在本专栏中【立创EDA-PCB设计基础】前面已经将所有网络布线铺铜好了&#xff0c;接下来进行DRC设计规则检查优化与丝印调整打样与PCB生产进度跟踪 目录 1.DRC设计规则检查 2.优化与丝印调整 1.过孔连接优化 2.泪滴…...

android 线程池的管理工具类

封装了各种类型的线程池&#xff0c;方便直接使用 看下有哪些类型&#xff1a; 默认线程池&#xff0c;搜索模块专用线程池&#xff0c;网络请求专用线程池&#xff0c;U盘更新&#xff0c;同步SDK读写操作线程池&#xff0c;日志打印使用线程池 DEFALUT&#xff0c;SEARCH&…...

编码风格之(5)GNU软件编码风格(3)

GNU软件编码标准风格(3) Author&#xff1a;Onceday Date: 2024年1月21日 漫漫长路&#xff0c;才刚刚开始… 本文主要翻译自《GNU编码标准》(GNU Coding Standards)一文。 参考文档: Linux kernel coding style — The Linux Kernel documentationGNU Coding Standard…...

8 种网络协议

什么是网络协议&#xff1f; 网络协议就是计算机之间沟通的语言&#xff0c;为了有效地交流&#xff0c;计算机之间需要一种共同的规则或协议&#xff0c;就像我们和老外沟通之前&#xff0c;要先商量好用哪种语言&#xff0c;要么大家都说中文&#xff0c;要么大家都说英语&a…...

Flash读取数据库中的数据

Flash读取数据库中的数据 要读取数据库的记录&#xff0c;首先需要建立一个数据库&#xff0c;并输入一些数据。数据库建立完毕后&#xff0c;由Flash向ASP提交请求&#xff0c;ASP根据请求对数据库进行操作后将结果返回给Flash&#xff0c;Flash以某种方式把结果显示出来。 …...

如何写出规范优雅的代码

编码规范是成为一个优质程序员的重要一课&#xff0c;它是编程的样式的模板。这篇文章将介绍12中编程规范及技巧&#xff0c;相信学习之后你的代码一定会提升一个档次。 首先我们要明确&#xff0c;为什么要遵循编码规范&#xff1f;遵循这样的约定有什么好处&#xff1f; 遵循…...

【数据结构】链表(单链表与双链表实现+原理+源码)

博主介绍&#xff1a;✌全网粉丝喜爱、前后端领域优质创作者、本质互联网精神、坚持优质作品共享、掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战✌有需要可以联系作者我哦&#xff01; &#x1f345;附上相关C语言版源码讲解&#x1f345; &#x1f44…...

14027.ptp 控制流

文章目录 1 ptp 控制流1.1 控制流分层 1 ptp 控制流 1.1 控制流分层 大体分为4层&#xff1a;1 ptp4l层&#xff1a; 获取配置文件、创建时钟、poll监控文件描述符。2 clock时钟层&#xff1a;提供提供clock_poll、clock_create、clock_sync 等3 port 端口层&#xff1a;port…...

【昕宝爸爸小模块】深入浅出之为什么POI的SXSSFWorkbook占用内存更小

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…...

CentOS安装Flume

CentOS安装Flume 一、简介二、安装1、下载2、解压3、创建配置文件4、启动flume agent5、验证 一、简介 Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and moving large amounts of log data. It has a simple and flexi…...

Qt 多次绘图

使用Qt 的时候发现&#xff1a; 背景&#xff1a;自己定义一个类&#xff0c;把它和某个ui文件绑定。(类似 Qt creator 默认创建的工程&#xff09;问题&#xff1a;当鼠标在窗口内单击的时候会触发2次绘图。&#xff1f;难道不应该是一次吗&#xff1f; 于是开始了如下的测试…...

设计模式介绍

概念&#xff1a; 设计模式是一套被反复使用的、多数人知晓、经过分类编目的优秀代码设计经验的总结。特定环境下特定问题的处理方法。 1&#xff09;重用设计和代码 重用设计比重用代码更有意义&#xff0c;自动带来代码重用 2&#xff09;提高扩展性 大量使用面向接口编程&…...

别再死记硬背了!用Python手把手带你画一棵哈夫曼树(附完整代码)

用Python动态构建哈夫曼树&#xff1a;从理论到可视化的完整实践指南 在计算机科学中&#xff0c;数据压缩是一个永恒的话题。想象一下&#xff0c;当你需要传输大量数据时&#xff0c;如何用最少的比特数表示最多的信息&#xff1f;这就是哈夫曼编码要解决的问题。传统的教科书…...

定制你的专属探针:PEG-锰基纳米材料,为精准科研而生

在纳米生物医学研究的前沿&#xff0c;标准化的材料往往难以完全契合你的实验设想。你是否正在为TME响应成像、MRI造影增强、化学动力学Treatment 或药物递送系统的构建而寻找一种可调控、生物相容性良好的纳米平台&#xff1f;现在&#xff0c;你可以完全掌控参数——PEG-锰基…...

700MHz 5G网络DTMB干扰实战:从测量到规避的完整解决方案

1. 项目概述&#xff1a;直面700MHz网络中的DTMB干扰挑战在5G网络的深度覆盖战役中&#xff0c;700MHz频段因其卓越的穿透能力和广阔的覆盖范围&#xff0c;被寄予厚望&#xff0c;成为解决偏远地区和室内深度覆盖难题的“黄金频段”。然而&#xff0c;理想很丰满&#xff0c;现…...

产品经理面试与求职攻略:Awesome Product Management 职业转型成功案例

产品经理面试与求职攻略&#xff1a;Awesome Product Management 职业转型成功案例 【免费下载链接】awesome-product-management &#x1f680; A curated list of awesome resources for product/program managers to learn and grow. 项目地址: https://gitcode.com/gh_mi…...

创业团队如何用Taotoken低成本试验多个AI模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 创业团队如何用Taotoken低成本试验多个AI模型 对于资源有限的创业团队而言&#xff0c;在开发产品原型或验证AI功能时&#xff0c;…...

基于MCP协议构建Python文档智能查询服务器,提升AI编程助手准确性

1. 项目概述&#xff1a;一个为Python开发者量身定制的文档智能助手如果你和我一样&#xff0c;每天大部分时间都在和Python代码打交道&#xff0c;那你肯定也经历过这样的场景&#xff1a;为了查一个函数的参数顺序&#xff0c;或者确认某个库的版本兼容性&#xff0c;不得不频…...

开源技能库OpenClaw-Skill:构建标准化自动化技能模块的实践指南

1. 项目概述&#xff1a;从“OpenClaw-Skill”看开源技能库的构建与集成最近在社区里看到brabaflow/openclaw-skill这个项目&#xff0c;第一眼就被它的名字吸引了。“OpenClaw”听起来像是一个开源版的“机械爪”&#xff0c;而“Skill”则指向了技能或能力。这让我立刻联想到…...

(122页PPT)数字化IT架构蓝图规划设计方案(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2501_92796370/92683861 资料解读&#xff1a;数字化 IT 架构蓝图规划设计方案 详细资料请看本解读文章的最后内容 在数字化转型浪潮下&#xff0c;运营商…...

基于数据科学的宠物性格分析:从行为量化到性格画像的工程实践

1. 项目概述与核心价值最近在逛GitHub的时候&#xff0c;发现了一个挺有意思的项目&#xff0c;叫petsonality。光看名字&#xff0c;你大概就能猜到它和“宠物”&#xff08;Pets&#xff09;以及“性格”&#xff08;Personality&#xff09;有关。没错&#xff0c;这是一个通…...

开源实践:基于Telnyx与AI构建实时智能通信系统

1. 项目概述&#xff1a;当AI遇上通信&#xff0c;一次开源协作的深度实践最近在GitHub上看到一个挺有意思的项目&#xff0c;叫team-telnyx/ai。光看名字&#xff0c;你可能会觉得这又是一个大模型应用或者AI工具库&#xff0c;但点进去仔细研究&#xff0c;会发现它的内核远不…...