React渲染相关内容——渲染流程API、Fragment、渲染相关底层API
React渲染过程依次遇到的函数
在React的渲染流程中,从组件的创建到其UI最终呈现到屏幕上,会经历一系列的生命周期方法和函数。这些方法和函数对于类组件(Class Components)和函数组件(Function Components)来说有所不同,尤其是自从React Hooks引入后,函数组件的能力得到了极大的增强。以下是React渲染流程中可能遇到的一些关键方法和函数,主要侧重于类组件,同时也会提及函数组件中的相关概念。
类组件中的渲染流程函数
-
构造函数(Constructor)
- 在类组件实例化时调用,用于初始化state和绑定方法。
- 在React 16.3及以后的版本中,通常不需要在构造函数中绑定方法,因为可以在类定义中直接使用箭头函数或者使用
React.memo(对于函数组件)来避免不必要的重新渲染。
-
静态方法
getDerivedStateFromProps- 在实例化或接收到新的props时调用,用于根据props更新state。
- 这是一个静态方法,因此不能访问组件的实例。
-
render方法- 返回组件的React元素树,这些元素描述了组件的UI结构。
- 这是一个纯函数,给定相同的props和state,应该总是返回相同的React元素。
-
生命周期方法
componentDidMount:在组件首次挂载后立即调用,适合执行副作用操作,如数据获取、订阅等。shouldComponentUpdate:在接收到新的props或state之前调用,用于决定组件是否需要重新渲染。返回false可以阻止渲染过程,提高性能。getSnapshotBeforeUpdate:在最近一次渲染输出(提交到DOM节点)之前调用,返回一个值作为componentDidUpdate的第三个参数。componentDidUpdate:在更新后立即调用,适合执行DOM操作或更新订阅。componentWillUnmount:在组件卸载及销毁之前调用,适合进行清理工作,如取消网络请求、清除定时器、取消订阅等。
函数组件中的渲染流程函数
对于函数组件,由于没有实例化和生命周期方法的概念,React引入了Hooks来提供类似的功能。
-
函数组件本身
- 每次组件的props或state发生变化时,都会重新调用函数组件,返回新的React元素。
-
React Hooks
useState:用于在函数组件中添加state,并返回一个状态值和一个更新该状态的函数。useEffect:用于在函数组件中执行副作用操作,类似于类组件中的componentDidMount、componentDidUpdate和componentWillUnmount。它接受一个函数和一个依赖数组,当依赖项发生变化时,函数会被调用。useContext:用于让你在函数组件中订阅React上下文(context)。useReducer:一个更复杂的state管理Hook,它接受一个reducer函数和一个初始state,并返回一个state值和一个dispatch方法。useCallback:返回一个记忆化的回调函数版本,该回调函数在依赖项不变的情况下不会改变。useMemo:返回一个记忆化的值,它只在依赖项发生变化时重新计算。useRef:可以在整个组件的生命周期内持久化数据而不引起重新渲染。useImperativeHandle:用于在使用forwardRef时自定义暴露给父组件的实例值。useLayoutEffect:其用法与useEffect相同,但它会在所有的DOM变更之后同步调用,可以用于读取DOM布局并同步触发重渲染。在浏览器执行绘制之前,useLayoutEffect内部的更新计划将被同步刷新。
总结
- 类组件和函数组件在React渲染流程中遇到的函数和方法有所不同。
- 类组件依赖于生命周期方法来执行副作用操作、更新state和进行清理工作。
- 函数组件则使用Hooks来提供类似的功能,同时保持组件的简洁性和可重用性。
Fragment
在React中,Fragment是一种特殊的组件,它允许你将子元素组合在一起,而不会向DOM添加额外的节点。这对于需要在单个元素中返回多个元素但又不希望引入额外DOM结构的场景非常有用。以下是关于React中Fragment的详细解释:
return返回原生HTML、自定义组件和fragment
一、Fragment的作用
- 组合元素:Fragment允许你将多个元素组合在一起,而不会破坏DOM结构。这在React组件中很常见,因为React组件通常只能返回一个根元素。
- 避免额外DOM节点:使用Fragment可以避免向DOM添加不必要的节点,从而保持DOM结构的简洁和高效。
二、Fragment的语法
- 完整语法:使用
<React.Fragment>来包裹子元素。例如:
function MyComponent() {return (<React.Fragment><h1>Title</h1><p>Paragraph 1</p><p>Paragraph 2</p></React.Fragment>);
}
- 简写语法:Fragment的简写语法是使用空的JSX标签
<>和</>。例如:
function MyComponent() {return (<><h1>Title</h1><p>Paragraph 1</p><p>Paragraph 2</p></>);
}
三、Fragment的属性
- key属性:Fragment唯一可以接受的属性是
key。当使用Fragment包裹一个元素集合,并且这个集合需要通过map函数或其他方式生成时,通常需要为每个元素指定一个唯一的key属性。例如:
function Glossary(props) {return (<dl>{props.items.map(item => (<React.Fragment key={item.id}><dt>{item.term}</dt><dd>{item.description}</dd></React.Fragment>))}</dl>);
}
或者使用简写语法:
function Glossary(props) {return (<dl>{props.items.map(item => (<><dt key={item.id}>{item.term}</dt><dd>{item.description}</dd></>// 注意:在简写语法中,key通常需要直接放在需要它的元素上,而不是Fragment上。// 上面的例子为了说明Fragment的key属性,实际上在简写语法中应该这样写:// <dt key={`${item.id}-term`}>{item.term}</dt>// <dd key={`${item.id}-description`}>{item.description}</dd>// 因为<>...</>本身不接受key属性。))}</dl>);
}// 更正后的简写语法示例:
function Glossary(props) {return (<dl>{props.items.map(item => (<React.Fragment key={item.id}> {/* 仍然可以使用React.Fragment并为其添加key */}<dt>{item.term}</dt><dd>{item.description}</dd></React.Fragment>) || (<>{/* 如果map中的元素需要单独的key,则应该直接放在对应的元素上 */}<dt key={`${item.id}-term`}>{item.term}</dt><dd key={`${item.id}-description`}>{item.description}</dd></>))}</dl>);// 注意:上面的更正示例中,第二个部分(使用<>...</>的)其实是一个假设的情境,// 实际上在map函数中,你应该为每个生成的元素对(dt和dd)分别指定key,// 而不是将key放在Fragment或<>上(因为它们不接受key属性)。
}// 正确的简写语法使用方式(为每个元素分别指定key):
function Glossary(props) {return (<dl>{props.items.map(item => (<><dt key={`${item.id}-term`}>{item.term}</dt><dd key={`${item.id}-description`}>{item.description}</dd></>))}</dl>);
}
注意:在简写语法<>...</>中,Fragment本身不接受key属性。如果需要为集合中的元素指定key,则应该直接将这些key属性放在需要它们的元素上,如上面的更正示例所示。
四、Fragment的应用场景
- 在表格中使用:当需要在
<table>中返回多个<tr>、<td>等元素时,可以使用Fragment来避免额外的<div>或<span>节点。 - 在列表中使用:当需要在
<ul>或<ol>中返回多个<li>元素时,同样可以使用Fragment。 - 在组件返回多个元素时使用:当React组件需要返回多个元素但又不希望引入额外DOM结构时,Fragment是一个很好的选择。
五、Fragment的注意事项
- Fragment不能作为事件的直接目标:因为Fragment不会渲染为真实的DOM节点,所以它不能作为事件的直接目标。如果需要为Fragment中的元素添加事件处理函数,应该直接将这些函数添加到对应的元素上。
- Fragment不支持ref属性:同样地,因为Fragment不是真实的DOM节点,所以它不支持
ref属性。如果需要引用Fragment中的元素,应该使用其他方法(如回调refs或React.createRef())。
综上所述,React中的Fragment是一个非常有用的工具,它允许你在不引入额外DOM结构的情况下组合多个元素。通过合理使用Fragment,可以保持DOM结构的简洁和高效,从而提高React应用的性能和可维护性。
渲染相关和性能相关API
React渲染相关和渲染优化相关的API主要包括以下几类:
一、React渲染相关API
-
ReactDOM.render:
- 作用:将React组件渲染到HTML文档中。
- 用法:
ReactDOM.render(<App />, document.getElementById('root'));,这里的<App />是React组件,document.getElementById('root')是HTML中的一个容器,用于渲染React组件。
-
React.Component:
- 作用:React中最基本的组件类型,用于构建用户界面。
- 特点:可以接受props和state作为参数,并返回一个虚拟DOM节点。
-
React.memo:
- 作用:用于函数式组件,可以使其只在props发生变化时重新渲染。
- 用法:
const MyComponent = React.memo(function MyComponent(props) {...});
-
Profiler(不稳定API,可能在未来的版本中发生变化):
- 作用:用于分析React组件的渲染性能,帮助识别应用程序中卡顿的原因。
- 用法:通过
onRender回调函数获取渲染时间和相关信息。
二、React渲染优化相关API
-
shouldComponentUpdate:
- 作用:通过重写该函数实现组件的条件渲染,即只有在组件的props或state发生变化时才重新渲染组件。
- 用法:在class组件中重写
shouldComponentUpdate(nextProps, nextState)方法,返回true或false以决定是否重新渲染。
-
PureComponent:
- 作用:React自带的一个纯组件,其shouldComponentUpdate函数已经被自动实现,只有在props或state发生变化时才会重新渲染组件。
- 特点:仅会做浅层比较,复杂的state、props需要自行对比。
-
useCallback和useMemo:
-
作用:用于缓存函数和计算结果,避免重复计算或渲染。
-
用法:
useCallback:返回一个记忆化的回调函数,该函数在依赖项不变时保持不变。useMemo:返回一个记忆化的值,该值在依赖项不变时保持不变。
-
-
React.Profiler(用于性能分析):
- 作用:除了作为渲染相关API外,还可以用于性能分析,帮助开发者识别和优化性能瓶颈。
- 用法:通过包裹需要分析的组件,并在
onRender回调中获取和分析渲染性能数据。
综上所述,React提供了丰富的渲染和渲染优化API,帮助开发者构建高效、可维护的用户界面。在开发过程中,根据具体需求和场景选择合适的API进行渲染和性能优化是至关重要的。
渲染相关和性能相关底层API
React渲染相关和渲染优化相关的底层API主要涉及React的虚拟DOM(VDOM)、调度系统、任务优先级以及React 18引入的一些新特性。以下是对这些底层API的详细解释:
一、React渲染相关底层API
-
ReactDOM.render
- 作用:将React组件渲染到DOM中。这是React应用启动的入口点,负责将React元素树挂载到指定的DOM节点上。
-
React Fiber(虚拟DOM)
- 作用:React使用虚拟DOM来提高渲染效率。虚拟DOM是一个轻量级的JavaScript对象,描述了真实DOM的结构。React通过比较新旧虚拟DOM的差异,然后只更新真实DOM中需要变化的部分,从而避免不必要的DOM操作。
- 底层实现:React Fiber是React 16引入的新的协调算法,它允许将渲染工作拆分成更小的工作单元,并可以中断和恢复这些工作单元,从而提高了React应用的响应性和性能。
二、React渲染优化相关底层API
-
Scheduler(调度系统)
- 作用:React 18引入了一个新的调度系统,它负责管理任务的优先级和执行顺序。调度系统使用优先级队列来安排任务,确保高优先级的任务能够优先得到执行。
- 底层实现:调度系统的核心是Scheduler模块,它提供了一套API来安排、更新和取消任务。React使用这套API来管理渲染任务的优先级和执行顺序。
-
并发模式(Concurrent Mode)
- 作用:并发模式是React 18中的一个重要特性,它允许React在不阻塞主线程的情况下执行渲染和更新。这意味着React可以在用户进行交互时继续处理后台任务,如数据获取和状态更新。
- 底层实现:并发模式依赖于React的调度系统和虚拟DOM算法。通过调度系统,React可以管理任务的优先级和执行顺序;通过虚拟DOM算法,React可以比较新旧虚拟DOM的差异,并只更新需要变化的部分。
-
startTransition
- 作用:startTransition是一个新的渲染API,它允许开发者将某些更新标记为“过渡性”的,这些更新可以被中断和延迟执行。这对于处理复杂的动画或过渡效果非常有用。
- 用法:使用startTransition包裹更新逻辑,告诉React接下来的更新不应该立即执行,而是等待过渡完成。
-
useDeferredValue
- 作用:useDeferredValue允许开发者创建一个延迟的值,它不会立即阻塞组件的渲染,但会在适当的时候更新。这对于优化需要等待某些数据加载完成的组件非常有用。
- 用法:使用useDeferredValue创建一个延迟的值,并将其传递给需要优化的组件。
-
shouldYieldToHigherPriorityWork
- 作用:这是一个内部函数,用于检查是否有更高优先级的工作需要执行。在并发模式中,React可以根据任务的类型和重要性分配不同的优先级,并允许低优先级的任务在执行过程中被中断,以便处理更高优先级的更新。
综上所述,React的渲染和渲染优化相关的底层API涉及虚拟DOM、调度系统、并发模式以及新的渲染API如startTransition和useDeferredValue等。这些API共同作用于React的渲染流程,提高了React应用的性能和响应性。
相关文章:
React渲染相关内容——渲染流程API、Fragment、渲染相关底层API
React渲染过程依次遇到的函数 在React的渲染流程中,从组件的创建到其UI最终呈现到屏幕上,会经历一系列的生命周期方法和函数。这些方法和函数对于类组件(Class Components)和函数组件(Function Components)…...
Python中dict支持多个key的方法
在Python中,字典(dict)是一种非常强大的数据结构,它允许我们通过键(key)来存储和检索值(value)。有时候,我们可能想要根据多个键来检索或操作字典中的数据。虽然Python的…...
丹摩 | 基于PyTorch的CIFAR-10图像分类实现
从创建实例开始的新项目流程 第一步:创建实例 登录 DAMODEL 平台。创建一个 GPU 实例: GPU 配置:选择 NVIDIA H800 或其他可用高性能 GPU。 系统配置:推荐使用 Ubuntu 20.04,内存 16GB,硬盘 50GB。 启…...
C#变量和函数如何和unity组件绑定
1.Button On_click (1)GameObject通过Add component添加上Script (2)Button选GameObject组件而不是直接选Script,直接选Script出现不了Script中的函数 2.RawImage 上面是错的 3.Text 上面是错的,应该是直接在GameObject里面填上对应的值 总结: …...
AI模型---安装cuda与cuDNN
1.安装cuda 先打开cmd 输入nvidia-smi 查看显卡支持cuda对应的版本: 然后去英伟达官网下载cuda(外网多刷几次) https://developer.nvidia.com/cuda-toolkit-archive 注意对应版本 安装过程中如果显示如下图: 请安装visual Stu…...
【大数据学习 | Spark-Core】Spark提交及运行流程
spark的集群运行结构 我们要选择第一种使用方式 命令组成结构 spark-submit [选项] jar包 参数 standalone集群能够使用的选项。 --master MASTER_URL #集群地址 --class class_name #jar包中的类 --executor-memory MEM #executor的内存 --executor-cores NUM # executor的…...
内网渗透横向移动1
1.信息收集 (1)判断域控 shell net time /domain shell ping OWA2010CN-God.god.org (2)主机探测 浏览探测->网络探测 主机列表显示: (3)域用户收集: shell net user /domain…...
现代密码学
概论 计算机安全的最核心三个关键目标(指标)/为:保密性 Confidentiality、完整性 Integrity、可用性 Availability ,三者称为 CIA三元组 数据保密性:确保隐私或是秘密信息不向非授权者泄漏,也不被非授权者使…...
Pod 动态分配存储空间实现持久化存储
配置 Pod 以使用 PersistentVolume 作为存储 关于持久卷的介绍,可以看官方文档 https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/ 持久卷根据存储位置,可以使用本地存储和云存储,如果有云服务平台,…...
Jackson、Gson、FastJSON三款JSON利器比拼
在Java领域,有多种JSON工具包,比如Jackson、Gson、FastJSON,每家都各有所长,下面我们从性能、特性、生态、易用 性等几个方面来展开下: 一、Jackson 性能 Jackson是一款高性能的JSON处理库。它在序列化和反序列化操作…...
php:nginx如何配置WebSocket代理?
在nginx配置中加入以下配置即可: server {listen 80;server_name test.com;# 配置 WebSocket 代理location /ws {proxy_pass http://127.0.0.1:8083;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade&qu…...
3349、检测相邻递增子数组 Ⅰ
3349、[简单] 检测相邻递增子数组 Ⅰ 1、题目描述 给你一个由 n 个整数组成的数组 nums 和一个整数 k,请你确定是否存在 两个 相邻 且长度为 k 的 严格递增 子数组。具体来说,需要检查是否存在从下标 a 和 b (a < b) 开始的 两个 子数组,…...
C++笔记之函数入参传递std::unique_ptr 时使用 std::move的场景
C++笔记之函数入参传递std::unique_ptr 时使用 std::move的场景 code review! 参考笔记 C++笔记之unique_ptr转移堆内空间的所有权 文章目录 C++笔记之函数入参传递std::unique_ptr 时使用 std::move的场景一.使用 std::unique_ptr 作为函数参数时的主要场景二.一个完整示例一…...
怎么只提取视频中的声音?从视频中提取纯音频技巧
在数字媒体的广泛应用中,提取视频中的声音已成为一项常见且重要的操作。无论是为了学习、娱乐、创作还是法律用途,提取声音都能为我们带来诸多便利。怎么只提取视频中的声音?本文将详细介绍提取声音的原因、工具、方法以及注意事项。 一、为什…...
数仓工具—Hive语法之窗口函数中的 case when
窗口函数中的 case when 今天我们看一下窗口函数和case when 的各种花活,最近的需求各种窗口,一个需求中十几个窗口,加上各种条件边界,所以写了大量的窗口函数和case when的组合,今天我们来看一下。 我们的数据如下 %spark.pyspark df2 = spark.createDataFrame([(&quo…...
基于微信小程序的酒店客房管理系统+LW示例参考
1.项目介绍 系统角色:管理员、员工、普通用户功能模块:员工管理、用户管理、客房管理、预订管理、商品管理、评价管理、续订管理、订单管理等技术选型:SSM,vue,uniapp等测试环境:idea2024,jdk1…...
Elasticsearch客户端在和集群连接时,如何选择特定的节点执行请求的?
大家好,我是锋哥。今天分享关于【Elasticsearch客户端在和集群连接时,如何选择特定的节点执行请求的?】面试题。希望对大家有帮助; Elasticsearch客户端在和集群连接时,如何选择特定的节点执行请求的? 100…...
【AI最前线】DP双像素sensor相关的AI算法全集:深度估计、图像去模糊去雨去雾恢复、图像重建、自动对焦
Dual Pixel 简介 双像素是成像系统的感光元器件中单帧同时生成的图像:通过双像素可以实现:深度估计、图像去模糊去雨去雾恢复、图像重建 成像原理来源如上,也有遮罩等方式的pd生成,如图双像素视图可以看到光圈的不同一半&#x…...
CTF之密码学(Polybius密码)
棋盘密码,也称为Polybius密码或方格密码,是一种基于替换的加密方法。以下是对棋盘密码的详细解析: 一、加密原理 棋盘密码使用一个5x5的方格棋盘,其中填充了26个英文字母(通常i和j被视为同一个字母并放在同一个格子中…...
【C++篇】从售票窗口到算法核心:C++队列模拟全解析
文章目录 须知 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗࿱…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
