学习React-25-React-路由懒加载

懒加载

在大型应用中,为了优化首屏加载速度,我们通常使用懒加载技术按需加载路由对应的组件。React 提供了 React.lazy() 函数配合 Suspense 组件来实现此功能。

小栗子
ts 复制代码
import Home from "../pages/Home";
import About from "../pages/About";
import { createBrowserRouter } from "react-router";
import Layout from "../pages/Layout";
// 模拟异步
const sleep = (ms = 2000) => new Promise(resolve => setTimeout(resolve, ms));
const router = createBrowserRouter([
  {
    path: "/",
    Component: Layout,
    children: [
      {
        path: "home",
        Component: Home, // 同步
      },
      {
        path: "about",
        // 关键:lazy 返回一个 Promise,resolve 的对象里可放 Component / loader / action 等
        lazy: async () => {
          await sleep(); 
          const about = await import("../pages/About"); 
          return { Component: about.default };
        }
      },
      
    ]
  },

])

export default router;

效果展示

很明显,当点击About之后停顿了两秒之后才完成about页面的加载。

注意事项
  • lazy 只在该路由第一次命中时触发;若同一路由再次进入不会重复拉包(除非手动刷新页面)。
  • 如果路由还配置了 loader,每次导航都会重新执行 loader,但组件 chunk 不会重新下载 。
  • 若使用声明模式( + )而非 createBrowserRouter,仍需用 React.lazy + Suspense 实现懒加载,react-router 不再额外封装。

useNavigation

useNavigation 是 React Router 库中的一个钩子函数(Hook),用于在组件中访问当前导航状态。它通常用于处理路由跳转、加载状态等场景。

核心功能
  • 获取导航状态:通过 useNavigation() 可以获取当前导航的状态(如 idle、submitting、loading)。
  • 执行导航操作:返回的 navigate 函数可用于编程式路由跳转。
代码示例

上面的懒加载虽然提高了性能,但是用户体验不好,下面是优化方案。

ts 复制代码
import { Spin } from 'antd';
import React from 'react';
// Outlet 子路由出口
import { Outlet, useNavigation } from 'react-router';


const Content: React.FC = () => {
  const navigation = useNavigation()
  console.log('路由状态', navigation.state)
  const isLoding = navigation.state === 'loading'
  return <div>
      {isLoding ? <Spin tip="Loading" size="large" style={{display: 'block', margin: '200px auto'}} /> : <Outlet />}
    </div>

};

export default Content;

效果如下

在点击About的时候,navigation.state的状态会经过 idle →loading→idle变化。

注意事项
  • 路由版本依赖:仅适用于 React Router v6 及以上版本。
  • 组件层级:必须在 或 的子孙组件中使用。
  • 状态时效性:location 和 formData 仅在导航过程中有效,完成后会重置。
相关推荐
华为云开发者联盟5 小时前
告别繁琐操作,华为云码道 + Docker重塑远程开发体验
人工智能·学习·docker·华为云·软件开发·华为云码道
008爬虫实战录5 小时前
【码上爬】 题十二:如来神掌 困难, JSVMP加密,使用代理补环境
前端·javascript·node.js
threelab5 小时前
Three.js 数学函数着色器 | 三维可视化 / AI 提示词
javascript·人工智能·着色器
Bechamz5 小时前
大数据开发学习Day38
大数据·学习
-To be number.wan5 小时前
计算机组成原理 | 原码一位乘法运算方法
学习·计算机组成原理
前端若水6 小时前
从零开始学习AI Agent的实战路线图
人工智能·学习
ZC跨境爬虫6 小时前
跟着 MDN 学CSS day_3:(为一个传记页面添加样式)
前端·javascript·css·ui·音视频·html5
夜雪闻竹6 小时前
sql.js WASM 实战:浏览器里跑 SQLite
javascript·sql·wasm
魔法阵维护师6 小时前
从零开发游戏需要学习的c#模块,第十一章(rpg小游戏入门,上篇,地图与移动)
学习·游戏·c#
qq_525513756 小时前
# 第七章 指令微调学习(四) 7.6基于指令数据对大语言模型进行微调
深度学习·学习·语言模型