React+TS前台项目实战(二)-- 路由配置 + 组件懒加载 + Error Boundary使用

文章目录


前言

本文将详细介绍项目中的页面路由配置和异步组件懒加载处理,以提高用户体验,实现过渡效果。


一、路由配置和懒加载lazy的使用

(1)在React中,通常使用Suspense和lazy函数来实现懒加载,比如使用一个加载动画。

(2)通过这种方式,可以减少初始加载时间,提高应用程序的性能和响应速度。

c 复制代码
// @/router/index.ts
import { lazy } from "react";
import { Navigate, RouteObject } from "react-router-dom";
const Layout = lazy(() => import("@/layout"));
const NotFound = lazy(() => import("@/pages/NotFound/index"));
const Home = lazy(() => import("@/pages/Home"));
const NervosDao = lazy(() => import("@/pages/NervosDao"));
const Tokens = lazy(() => import("@/pages/Tokens"));
const Xudts = lazy(() => import("@/pages/Xudts"));
const Charts = lazy(() => import("@/pages/Charts"));
const FeeRateTracker = lazy(() => import("@/pages/FeeRateTracker"));
const routes: RouteObject[] = [
  {
    path: "/",
    element: <Navigate to={`/zh/home`} />,
  },
  {
    path: "/:locale",
    element: <Navigate to={`/zh/home`} />,
  },
  {
    path: "/:locale",
    element: <Layout />,
    children: [
      // 其他子路由配置
      {
        path: "/:locale/home",
        element: <Home />,
      },
      {
        path: "/:locale/nervosdao",
        element: <NervosDao />,
      },
      {
        path: "/:locale/tokens",
        element: <Tokens />,
      },
      {
        path: "/:locale/xudts",
        element: <Xudts />,
      },
      {
        path: "/:locale/charts",
        element: <Charts />,
      },
      {
        path: "/:locale/fee-rate-tracker",
        element: <FeeRateTracker />,
      },
    ],
  },
  {
    path: "/404",
    element: <NotFound />,
  },
  {
    path: "*",
    element: <Navigate to={`/404`} />,
  },
];
export default routes;

二、TS版本Error Boundary组件封装

c 复制代码
// @/components/ErrorBoundary/index.jsx
import * as React from "react";
interface PropsType {
  children: React.ReactNode;
}
interface StateType {
  hasError: boolean;
  Error?: null | Error;
  ErrorInfo?: null | React.ErrorInfo;
}
export class ErrorBoundary extends React.Component<PropsType, StateType> {
  constructor(props: PropsType) {
    super(props);
    this.state = {
      hasError: false,
      Error: null,
      ErrorInfo: null,
    };
  }
  //控制渲染降级UI
  static getDerivedStateFromError(error: Error): StateType {
    return { hasError: true };
  }
  //捕获抛出异常
  componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
    //传递异常信息
    this.setState((preState) => ({ hasError: preState.hasError, Error: error, ErrorInfo: errorInfo }));
    //可以将异常信息抛出给日志系统等等
    //do something....
  }
  render() {
    const { hasError, Error, ErrorInfo } = this.state;
    const { children } = this.props;
    //如果捕获到异常,渲染降级UI
    if (hasError) {
      return (
        <div>
          <h1>{`Error:${Error?.message}`}</h1>
          <details style={{ whiteSpace: "pre-wrap" }}>{ErrorInfo?.componentStack}</details>
        </div>
      );
    }
    return children;
  }
}

三、在layout组件中使用Suspense组件和错误边界组件

c 复制代码
// @/layout/index.tsx
import { Suspense } from "react";
import { ErrorBoundary } from "@/components/ErrorBoundary";
const LayOut = () => {
  // ....
  return (
    // ...
    <Suspense fallback={<span>loading...</span>}>
      <ErrorBoundary>
        <Outlet />
      </ErrorBoundary>
    </Suspense>
    // ...
  );
};
export default LayOut;

总结

下一篇讲【国际化配置】。关注本栏目,将实时更新。

相关推荐
cindershade3 小时前
用原生 HTML5 视频与 Canvas 实现浏览器端视频抽帧封面
前端
笨鸟先飞,勤能补拙3 小时前
Web 服务器与计算机网络全景原理
运维·服务器·前端·网络·人工智能·计算机网络·web安全
NutShell Wang3 小时前
Wails v3 Beta 实战:用显式对象模型重写你的第一个 Go 桌面应用
前端·人工智能·go·vibe coding
cindershade3 小时前
前端国际化工程实践:语言包拆分、动态加载与日期数字格式统一
前端
kisbad3 小时前
Day 036|OpenAI Agents SDK 快速开始:今天跑通第一个 Agent
java·前端·javascript
qq_267612893 小时前
Gitee CodePecker行业场景化落地指南:金融、车联网与IoT双引擎选型与工程化路径
前端·gitee·自动化
初晨未凉3 小时前
elementui自定义内容图片预览
前端
无糖可可果4 小时前
从零读懂一个 Next.js 全栈笔记应用
前端
Maxkim4 小时前
DeepSeek Harness 源码深度分析:像 VS Code 一样插件化的 Agent 框架
前端·架构
喜欢睡觉4 小时前
从零看懂一个 Next.js 笔记应用
前端