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 完成渲染。

相关推荐
怕浪猫几秒前
2026最新React技术栈梳理,全栈必备
前端·javascript·面试
Bigger13 分钟前
Tauri (24)——窗口在隐藏期间自动收起导致了位置漂移
前端·react.js·app
雲墨款哥33 分钟前
从一行好奇的代码说起:Vue怎么没有React的props.children
前端·vue.js·react.js
用户8168694747251 小时前
Effect 执行时机与事件循环交错关系
前端·react.js
triumph_passion1 小时前
React Hook Form 状态下沉最佳实践
前端·react.js
CDwenhuohuo1 小时前
uniapp去掉手机状态栏 全屏展示
开发语言·javascript·uni-app
千寻girling1 小时前
面试官: “ 说一下怎么做到前端图片尺寸的响应式适配 ”
前端·javascript·面试
cz追天之路2 小时前
华为机考 ------ 计算某字符出现次数
前端·javascript·华为机考
爱编码的傅同学3 小时前
【单例模式】深入理解懒汉与饿汉模式
java·javascript·单例模式
用户6802659051193 小时前
2026年企业级网络监控选型指南
javascript·后端·面试