在 create-react-app (CRA) 创建的应用中使用 react-router-dom v7以及懒加载的使用方法

在 create-react-app (CRA) 创建的应用中使用 react-router-dom v7 的方法

众所周知,react-router v7 的使用方式发生了一些变化,开发者在使用时可能会遇到一些问题。

官方文档提供了三种模式:框架模式、数据模式、声明模式。

  • 本文将重点介绍数据模式的基本使用方法。

  • 懒加载的使用方式也与之前的 router v6 有所不同,将在后续代码中进行说明。

以下是具体的使用步骤:

1. 准备 CRA 项目

确保你已有一个使用 create-react-app 创建的项目。

2. 安装 react-router-dom v7

bash 复制代码
npm install react-router-dom@7

3. 配置路由器及路由表 (/src/router/index.tsx)

以下配置中的 Demo 组件使用了懒加载方式。

tsx 复制代码
// /src/router/index.tsx

import type { RouteObject } from "react-router-dom";
import React from "react";
import { createHashRouter, Navigate } from "react-router-dom";

import App from "@/App";

const routes: RouteObject[] = [
  {
    path: "/",
    // App 组件未使用异步加载
    Component: App,
    children: [
      {
        index: true, // 当路径为 / 时,作为默认子路由
        element: <Navigate to="/demo" replace />
      },
      {
        path: "/demo",
        // 异步导入组件(懒加载)
        lazy: async () => {
          const Component = await import("@/views/Demo");
          return {
            Component: Component.default,
          };
        },
        // 如果不使用懒加载,则直接使用 element 属性
        // element: <Demo />
      },
    ],
  }
];

export const router = createHashRouter(routes);

4. App.tsx 组件的写法

  • 使用 <Outlet /> 作为子路由的占位符。
  • 利用 useNavigation 处理加载状态。
tsx 复制代码
import React from "react";
import { Link, Outlet, useNavigation } from "react-router-dom";
import Loading1 from "@/views/loading1"; // 修正了组件名拼写 (loding1 -> loading1)

function App() {
  // 判断异步加载状态
  const navigation = useNavigation();
  console.log(navigation.state);
  const isLoading = navigation.state === "loading";

  return (
    <div className="App">
      <div>
        <Link to="/demo">Demo</Link>
      </div>

      <div>
        {/* 如果是异步加载组件,可以这样显示加载过程中的提示 */}
        {isLoading ? <Loading1 /> : <Outlet />}
      </div>
    </div>
  );
}

export default App;

5. 入口文件写法 (/src/index.tsx)

由于我们使用的是布局路由和数据模式,写法会有所不同:

  • 使用 <RouterProvider /> 渲染路由。
tsx 复制代码
// /src/index.tsx

import React from "react";
import ReactDOM from "react-dom/client";
import { RouterProvider } from "react-router-dom";

// 导入之前配置的路由器
import { router } from "./router";

const root = ReactDOM.createRoot(
  document.getElementById("root") as HTMLElement
);

// 使用 RouterProvider 渲染,App 组件已包含在路由配置中
root.render(<RouterProvider router={router} />);

完成以上步骤即可正常使用路由。

相关推荐
小刘鸭地下城1 小时前
Web安全必备:关键 HTTP 标头解析
前端
yddddddy1 小时前
html基本知识
前端·html
开心不就得了2 小时前
React 状态管理
react.js·typescript
荣达2 小时前
koa洋葱模型理解
前端·后端·node.js
reembarkation3 小时前
使用pdfjs-dist 预览pdf,并添加文本层的实现
前端·javascript·pdf
KenXu3 小时前
F2C-PTD工具将需求快速转换为代码实践
前端
天天进步20153 小时前
掌握React状态管理:Redux Toolkit vs Zustand vs Context API
linux·运维·react.js
给月亮点灯|3 小时前
Vue3基础知识-setup()、ref()和reactive()
前端·javascript·vue.js
芜青3 小时前
【Vue2手录12】单文件组件SFC
前端·javascript·vue.js