React Suspense的原理

React Suspense组件的作用是当组件未完成加载时,显示 fallback 组件。那么 Suspense 是如何实现的呢?React 的渲染是通过 Fiber 进行的,Suspense 的更新机制也是要围绕 Fiber 架构进行的。Suspense 是由两部分组成,实际 UI 子组件 primary 和 fallback 组件。Suspense 正常的流程是,初始化时显示 fallback 组件,当 primary 组件完成加载之后,显示 primary 组件。这里的关键点就是,如何触发 Primary 组件的显示,这里是要通过一个回调的方法进行更新,当组件完成加载后通知 UI 进行渲染更新。

我们看一下 React 是怎么实现 Suspense,首先通过 Lazy 实现一个 Suspense 效果:

复制代码
 <Suspense fallback={<Loading />}>
   <h2>Preview</h2>
   <MarkdownPreview markdown={markdown} />
 </Suspense>

Suspense Primary 组件抛出 payload._result,_result 是 promise 对象,组件加载完成之后调用 Resolve。

Throw 抛出的异常,在 handleError 方法中进行处理。

调用 throwException 处理 promise

下图中, markSuspenseBoundaryShouldCapture 用于显示 fallback,注册ping / retry 监听器用于绑定监听器,这里监听器负责处理 Promise。

在 attachRetryListener 中加 wakeable 加入 update 队列,wakeable 就是 promise 对象。

总结

Suspense 组件通过监听 Promise 来判断 Primary 组件是否完成加载,如果加载完成,通过正常的 Fiber Update Queue 完成渲染。

相关推荐
Fairy要carry40 分钟前
项目01-手搓Agent之loop
前端·javascript·python
kyriewen1 小时前
DOM树与节点操作:用JS给网页“动手术”
前端·javascript·面试
米饭同学i1 小时前
基于腾讯云COS的小程序素材上传功能实现
前端·javascript·react.js
光影少年1 小时前
如何开发一个CLI工具?
javascript·测试工具·前端框架·node.js
哈__1 小时前
ReactNative项目OpenHarmony三方库集成实战:react-native-fingerprint-scanner
javascript·react native·react.js
晴栀ay1 小时前
Generator + RxJS 重构 LLM 流式输出的“丝滑”架构
javascript·后端·llm
我是伪码农2 小时前
14届蓝桥杯
javascript·css·css3
装不满的克莱因瓶2 小时前
React Native vs Flutter:一次深入到底的性能对比分析(含原理 + 实战)
javascript·flutter·react native·react.js·app·移动端
gCode Teacher 格码致知3 小时前
Javascript及Python提高:将对象的键值对转换为数组元素的方式以及两种语言的对比-由Deepseek产生
javascript·python
Hello.Reader3 小时前
Spark Connect 快速入门远程连接 Spark 集群实战
javascript·ajax·spark