vite4 + react18 + react-router-dom6 路由懒加载、路由重定向

前言

下雨天,摸鱼天。由于本人所在的团队准备用react搭建项目,然后渺小的我看了一下react所用到的路由react-router-dom,然后进行了一系列的操作,得出的一些个人心得。(reactrouter文档)

项目展示以及依赖

路由懒加载

在我的学习下,我发现有3种加载路由文件的方法,需要使用路由懒加载那么就要使用第二或者第三种方法就可以了

js 复制代码
// 第一种 同步导入
import NotFound from "../pages/NotFound";
// 第二种 按需加载(React的懒加载----React.lazy)
import { lazy } from "react";
const Main = lazy(() => import("../pages/Main"));
// 第三种 按需加载(react-router-dom的懒加载----lazy)
async lazy() {
    let home = await import("../pages/Home");
    return {
        Component: home.default,
    };
}

这2种路由懒加载的区别

  • React.lazy 需要配合 Suspense 组件使用,显示加载状态
  • react-router-dom 需要使用 useNavigation 获取路由当前的状态(idle → loading → idle),显示加载状态

实验如下

我把Home页面和Main都加载延迟2秒,然后通过Navigate来进行路由的切换,在加载路由的时候通过页面展示来显示加载的状态。

js 复制代码
// router/index.jsx
import { createHashRouter } from "react-router-dom";
import { lazy } from "react";
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const Layout = lazy(() => import("../pages/Layout"));
const Main = lazy(async () => {
    await sleep(2000); // 模拟加载延迟
    let Main = await import("../pages/Main");
    return Main

});
import NotFound from "../pages/NotFound";
const router = createHashRouter([
    {
        path: "/",
        Component: Layout,
        children: [
            {
                path: "/Home",
                async lazy() {
                    await sleep(2000); // 模拟加载延迟
                    let home = await import("../pages/Home");
                    return {
                        Component: home.default,
                    };
                },
            },
            { path: "/Main", Component: Main },
            { path: "/NotFound", Component: NotFound },
        ]
    },
])
export default router;
js 复制代码
// app.jsx
import './App.css'
import { RouterProvider } from "react-router-dom";
import router from "./router";
function App() {
  return (
      <RouterProvider router={router} />
  )
}
export default App
js 复制代码
// NotFound/index.jsx
import { NavLink } from "react-router-dom";
export default function NotFound() {
  return (
    <div>
      <h1>NotFound</h1>
            <NavLink to="/Main">跳转到Main</NavLink>

    </div>
  );
}
js 复制代码
// Main/index.jsx
import { NavLink } from "react-router-dom";

export default function Main() {
  return (
    <div>
      <h1>main</h1>
        <NavLink to="/Home">跳转到Home</NavLink>
    </div>
  );
}
js 复制代码
// Home/index.jsx
import { NavLink } from "react-router-dom";
export default  function Home() {

  return (
    <div>
      <h1>home</h1>
      <NavLink to="/NotFound">跳转到NotFound</NavLink>
    </div>
  );
}
js 复制代码
// Layout/index.jsx
import { Outlet, useNavigation } from 'react-router-dom';
import { Suspense } from 'react'
export default function Layout() {
    const navigation = useNavigation();
    const { state } = navigation;
    const loading = state === 'loading';
    return <div>
        {
            loading === true ? (<div> react-router的页面加载中...</div >) : (
                <Suspense fallback={<div>Suspense的页面加载中...</div>}>
                    <Outlet />
                </Suspense>
            )
        }
    </div>
}

效果展示

使用路由懒加载的好处

使用懒加载打包后,会把懒加载的组件打包成一个独立的文件,从而减小主包的大小。

未使用懒加载打包结果

js 复制代码
import { createHashRouter, Navigate } from "react-router-dom";
import { lazy } from "react";
import Layout from "../pages/Layout";
import Home from "../pages/Home";
import Main from "../pages/Main";
import NotFound from "../pages/NotFound";
const router = createHashRouter([
    {
        // 主页重定向到 /Home
        index: true,
        element: <Navigate to="/Home" replace></Navigate>,
    },
    {
        path: "/",
        Component: Layout,
        children: [
            { path: "Home", Component: Home },
            { path: "Main", Component: Main },
            { path: "NotFound", Component: NotFound },
        ]
    },
    {
        // 这里使用了通配符路径 "*" 来匹配所有未匹配的路径
        // 这样可以确保所有未匹配的路径都会显示 404 页面
        path: "*",
        Component: NotFound
    },
])
export default router;

使用懒加载打包结果

js 复制代码
import { createHashRouter, Navigate } from "react-router-dom";
import { lazy } from "react";
const Layout = lazy(() => import("../pages/Layout"));
const Main = lazy(() => import("../pages/Main"));
const NotFound = lazy(() => import("../pages/NotFound"));
const router = createHashRouter([
    {
        // 主页重定向到 /Home
        index: true,
        element: <Navigate to="/Home" replace></Navigate>,
    },
    {
        path: "/",
        Component: Layout,
        children: [
            {
                path: "Home",
                async lazy() {
                    let home = await import("../pages/Home");
                    return {
                        Component: home.default,
                    };
                },
            },
            { path: "Main", Component: Main },
            { path: "NotFound", Component: NotFound },
        ]
    },
    {
        // 这里使用了通配符路径 "*" 来匹配所有未匹配的路径
        // 这样可以确保所有未匹配的路径都会显示 404 页面
        path: "*",
        Component: NotFound
    },
])
export default router;

路由重定向

为什么要使用路由重定向

  • 当用户访问根路径的时候,会自动转跳到其他页面
  • 路由边界的问题,当用户访问一个根本没有的路径时,会自动跳转到一个特定的页面

实验如下

一开始打开网页的时候,输入根路径 http://localhost:5173/#/ 然后让路由自己重定向到Home页面。接着我在url上输入一个不存在的路径时 http://localhost:5173/#/321 ,路由会帮我跳转到NotFound页面

js 复制代码
import { createHashRouter, Navigate } from "react-router-dom";
import { lazy } from "react";
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const Layout = lazy(() => import("../pages/Layout"));
const Main = lazy(async () => {
    await sleep(2000); // 模拟加载延迟
    let Main = await import("../pages/Main");
    return Main

});
import NotFound from "../pages/NotFound";
const router = createHashRouter([
    {
        // 主页重定向到 /Home
        index: true,
        element: <Navigate to="/Home" replace></Navigate>,
    },
    {
        path: "/",
        Component: Layout,
        children: [
            {
                path: "/Home",
                async lazy() {
                    await sleep(2000); // 模拟加载延迟
                    let home = await import("../pages/Home");
                    return {
                        Component: home.default,
                    };
                },
            },
            { path: "/Main", Component: Main },
            { path: "/NotFound", Component: NotFound },
        ]
    },
    {
        // 这里使用了通配符路径 "*" 来匹配所有未匹配的路径
        // 这样可以确保所有未匹配的路径都会显示 404 页面
        path: "*",
        Component: NotFound
    },
])
export default router;

效果展示

相关推荐
咩咩啃树皮7 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
阳光是sunny7 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
触底反弹7 小时前
一文搞懂 Tailwind CSS 弹性布局:从原理到实战
前端·css·html
阳光是sunny7 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
小林ixn8 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
REDcker8 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
এ慕ོ冬℘゜9 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
武子康9 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
一点一木10 小时前
从60首歌到1个网站:输入你的故事,还你一首歌
前端·github
IT_陈寒11 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端