react路由中Suspense的详细介绍

 更新时间:2025年05月19日 12:00:09   作者:zwjapple  
AppRouter这个组件是一个在现代 React 应用中非常常见的模式,特别是在使用 React Router v6+ 进行路由管理和结合代码分割(Code Splitting)来优化性能时,这篇文章主要介绍了react路由中Suspense的详细介绍,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧

好的,我们来详细解释一下这个 AppRouter 组件的代码。

这个组件是一个在现代 React 应用中非常常见的模式,特别是在使用 React Router v6+ 进行路由管理和结合代码分割(Code Splitting)来优化性能时。

const AppRouter = () => {
  const element = useRoutes(routes);
  return <Suspense fallback={<PageLoading />}>{element}</Suspense>;
};

组件功能概述:

AppRouter 组件的核心功能是根据当前的 URL 决定渲染哪个页面组件,并且在页面组件(特别是那些通过代码分割延迟加载的组件)正在加载时显示一个加载中的提示。

代码逐行解释:

const AppRouter = () => { ... };

这定义了一个名为 AppRouter 的函数式 React 组件。

const element = useRoutes(routes);

useRoutes 是 React Router v6+ 提供的一个 Hook。它接收一个 routes 配置数组作为参数。这个 routes 数组通常包含了你的应用中所有路由的定义,比如哪个路径对应哪个组件。例如: JavaScript

const routes = [
  { path: '/', element: <HomePage /> },
  { path: '/about', element: <AboutPage /> }, // 可能是通过 React.lazy 导入的组件
  { path: '*', element: <NotFoundPage /> },
];

useRoutes Hook 会读取当前的 URL,然后在 routes 数组中找到匹配的路由配置。它返回与当前 URL 匹配的路由配置中 element 对应的 React 元素。换句话说,它会返回应该当前渲染的页面组件(或 null,如果没有匹配到)。所以,element 变量现在 holding 了根据当前 URL 应该显示的页面组件。

return <Suspense fallback={<PageLoading />}>{element}</Suspense>;

这是组件的返回值,渲染了核心的路由内容。

  • <Suspense> 是 React 内置的一个组件。它是用于处理异步操作的一种方式,特别常用于代码分割(Code Splitting)
  • Suspense子组件(在这里是 {element},也就是当前路由匹配到的页面组件)因为它自身需要的某些资源(例如通过 React.lazy 延迟加载的代码块)还没有加载完成而**暂停渲染(suspends)**时,Suspense 就会捕获这个暂停。fallback={<PageLoading />}<Suspense> 组件的一个重要属性。
  • fallback 属性:它指定了一个在子组件暂停渲染期间需要显示的备用 UI
  • <PageLoading />:在这个例子中,fallback 的值是一个 <PageLoading /> React 元素。PageLoading 应该是一个你自定义的组件,用来显示加载中的状态,比如一个旋转的加载图标、一个进度条或者简单的文本提示。
  • 用法:这意味着当 element(即当前页面组件)因为代码正在异步加载而无法立即渲染时,React 会暂时渲染 <PageLoading /> 组件来代替它。一旦 element 所需的代码加载完成并可以渲染了,Suspense 就会自动切换回渲染 element

Suspense 和 fallback 的作用总结:

  • 当你使用 React.lazy() 来导入一个组件(例如,将每个路由对应的页面组件都进行 lazy 导入),首次访问这个组件时,React 需要异步加载对应的 JavaScript 代码块。在代码块加载完成之前,React.lazy() 返回的组件会触发一个“暂停”(suspension)。
  • <Suspense> 组件就是用来捕获这种暂停的。
  • fallback 属性则定义了在暂停期间显示什么内容。这提供了一种优雅的方式来处理加载状态,而不是手动管理 loading 状态变量。

这个 AppRouter 组件的整体工作流程:

用户访问应用的某个 URL。useRoutes(routes) 根据 URL 找到匹配的路由配置,并返回对应的页面组件(存储在 element 中)。这个页面组件很可能是通过 React.lazy() 异步加载的。element 被渲染到 <Suspense> 内部。如果 element 是一个通过 React.lazy() 导入的组件,并且其代码正在加载中,它会触发暂停。<Suspense> 捕获这个暂停,并渲染 fallback 属性指定的内容,即 <PageLoading /> 组件。用户看到加载提示。当 element 所需的代码加载完成后,React 自动重试渲染 element。这次 element 可以正常渲染了,<Suspense> 移除 <PageLoading />,并显示真实的页面内容。

为什么要这样用?

  • 主要原因是为了实现代码分割,从而提升应用的初始加载性能。通过将每个路由的代码分割成单独的文件,用户访问应用时只需下载当前页面的代码,而不是整个应用的代码。当用户导航到其他页面时,再按需加载对应页面的代码。
  • Suspensefallback 提供了一种与代码分割配合使用的标准方式来显示加载状态。

总而言之,这个 AppRouter 组件利用 useRoutes 进行路由匹配,并结合 <Suspense>fallback 属性为通过 React.lazy() 进行代码分割的路由组件提供了统一的加载状态处理。<PageLoading /> 就是在这些异步加载发生时用户会看到的占位符。

解释 Suspense 和 fallback:

  • Suspense: 想象它是一个看门人。它看着它内部的孩子们 ({element})。如果任何一个孩子说“等等,我还没准备好,我正在等一些数据或代码”,Suspense 就会把这个孩子暂时藏起来,然后展示它的 fallback 属性指定的内容。一旦孩子说“好了,我准备好了”,Suspense 就会把孩子重新放出来。
  • fallback={<PageLoading />}: 这个属性告诉 Suspense,当它的子组件 ({element}) 处于“等待”状态时,应该显示什么。在这里,我们告诉它显示我们创建的 <PageLoading /> 组件。这个 <PageLoading /> 就是用户在等待页面内容加载时看到的 UI。

这种模式的优点在于:

  • 性能优化 (代码分割): 结合 React.lazy,可以实现按需加载代码,减少初始加载时间和带宽消耗。
  • 更好的用户体验: 在内容加载期间显示一个加载提示,而不是一个空白页面或错误,让用户知道应用还在工作。
  • 简洁的代码: 不需要手动在组件内部管理加载状态 (isLoading: true/false),Suspense 帮你处理了。

所以,AppRouter 组件有效地将路由匹配 (useRoutes)、异步加载处理 (Suspense) 和加载状态显示 (fallback) 结合在一起,构建了一个健壮且性能友好的应用路由结构。

到此这篇关于react路由中Suspense的介绍的文章就介绍到这了,更多相关react路由Suspense内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • react 实现图片正在加载中 加载完成 加载失败三个阶段的原理解析

    react 实现图片正在加载中 加载完成 加载失败三个阶段的原理解析

    这篇文章主要介绍了react 实现图片正在加载中 加载完成 加载失败三个阶段的,通过使用loading的图片来占位,具体原理解析及实现代码跟随小编一起通过本文学习吧
    2021-05-05
  • React状态管理Redux原理与介绍

    React状态管理Redux原理与介绍

    redux是redux官方react绑定库,能够使react组件从redux store中读取数据,并且向store分发actions以此来更新数据,这篇文章主要介绍了react-redux的设置,需要的朋友可以参考下
    2022-08-08
  • React在Dva项目中创建并引用页面局部组件的方式

    React在Dva项目中创建并引用页面局部组件的方式

    这篇文章主要介绍了React在Dva项目中创建并引用页面局部组件的方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 实现React单页应用的方法详解

    实现React单页应用的方法详解

    今天我们来学习React是如何构建起一个单页应用的,React作为目前最流行的前端框架之一,其受欢迎程度不容小觑,从这门框架上我们可以学到许多其他前端框架所缺失的东西,也是其创新性所在的地方,比如虚拟DOM、JSX等。下面一起来看看。
    2016-08-08
  • React Native 集成jpush-react-native的示例代码

    React Native 集成jpush-react-native的示例代码

    这篇文章主要介绍了React Native 集成jpush-react-native的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 详解React中共享组件逻辑的三种方式

    详解React中共享组件逻辑的三种方式

    这篇文章主要介绍了详解React中共享组件逻辑的三种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 详解React native全局变量的使用(跨组件的通信)

    详解React native全局变量的使用(跨组件的通信)

    本篇文章主要介绍了详解React native全局变量的使用(跨组件的通信),具有一定的参考价值,有兴趣的同学可以了解一下
    2017-09-09
  • 一文详解React类组件中的refs属性

    一文详解React类组件中的refs属性

    react中的ref类似于vue中的ref,都是可以操作dom的,这篇文章我们通过一个demo来学习这个属性,文中有详细的代码示例供大家参考,具有一定的参考价值,需要的朋友可以参考下
    2023-08-08
  • React 组件渲染和更新的实现代码示例

    React 组件渲染和更新的实现代码示例

    这篇文章主要介绍了React-组件渲染和更新的实现代码示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • React使用Electron开发桌面端的详细流程步骤

    React使用Electron开发桌面端的详细流程步骤

    React是一个流行的JavaScript库,用于构建Web应用程序,结合Electron框架,可以轻松地将React应用程序打包为桌面应用程序,本文详细介绍了使用React和Electron开发桌面应用程序的步骤,需要的朋友可以参考下
    2023-06-06

最新评论