React H5设置企业级v6版本路由的配置

news2024/9/22 23:17:29

路由配置是项目开发的必要一环,尤其是目前流行SPA,下面看看如何使用v6版本路由进行合理的H5路由配置

一、基本页面结构(目录根据开发要求建,下面仅用于展示配置路由)

在这里插入图片描述

二、具体文件实现

1. index.tsx

import React from "react";
import ReactDOM from "react-dom/client";
import vconsole from "vconsole";
import { createBrowserRouter, RouterProvider } from "react-router-dom";
import "normalize.css/normalize.css";
import routes from "./router";

const BASENAME = "/h5";

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

const router = createBrowserRouter(routes, { basename: BASENAME });

root.render(
  <React.StrictMode>
    <RouterProvider router={router} />
  </React.StrictMode>
);

if (
  process.env.NODE_ENV === "development" ||
  window.location.search.includes("debug=true")
) {
  new vconsole();
}

2. App.tsx

import { Suspense } from "react";
import { AliveScope } from "react-activation";
import { Outlet } from "react-router-dom";

function App() {
  return (
    <Suspense>
      <AliveScope>
        {/* Outlet是React Router v6中的一个组件,用于在嵌套路由中渲染子路由的组件。它充当一个占位符,表示在这个位置将渲染匹配的子路由组件。 */}
        <Outlet />
      </AliveScope>
    </Suspense>
  );
}

export default App;

3. ./router/index.tsx

import App from "@/App";
import type { RouteObject } from "react-router";
import { Navigate } from "react-router-dom";
// @loadable/component 是一个用于 React 应用程序的库,主要用于实现代码拆分和懒加载。它允许你将组件按需加载,从而减少初始加载时间,提高应用性能。
// 官网:https://loadable-components.com/docs/getting-started/
import loadable from "@loadable/component";
import mainRoutes from "./mainRoutes";
import userRoutes from "./userRoutes";

const NotFound = loadable(() => import("@/pages/NotFound"));

// 在路由的第一层应该在前面加上【/】
// 在 children 里面不需要加【/】,对于嵌套路由,子路径通常不需要以斜杠 (/) 开头,因为它们是相对于父路径解析的。
let routes: RouteObject[] = [
  {
    path: "/",
    element: <App />,
    children: [mainRoutes, userRoutes],
  },
  // 匹配不准确的路由,跳转到 404 页面
  {
    path: "*",
    element: <NotFound />,
  },
];

const Devtool = loadable(() => import("@/pages/Devtool"));

// 如果是开发环境,添加 devtool 页面,用于快速页面跳转
if (process.env.NODE_ENV === "development") {
  routes = [
    {
      path: "/",
      element: <Navigate to={"devtool"} replace />,
    },
    {
      path: "/devtool",
      element: <Devtool />,
    },
    ...routes,
  ];
}

export default routes;

4. ./router/mainRoutes.tsx

import type { RouteObject } from "react-router";
import KeepAlive from "react-activation";
import { lazy } from "react";
import { Navigate } from "react-router-dom";

const MainLayout = lazy(() => import("@/pages/Main/Layout"));

const MainList = lazy(() => import("@/pages/Main/List"));

const MainDetail = lazy(() => import("@/pages/Main/Detail"));

/**
 * 主要业务内容路由
 */
const mainRoutes: RouteObject = {
  path: "main",
  element: <MainLayout />,
  children: [
    // v6重定向用Navigate标签定义跳转
    {
      path: "",
      element: <Navigate to="list" replace />,
    },
    {
      path: "list",
      element: (
        <KeepAlive name="main-list">
          <MainList />
        </KeepAlive>
      ),
    },
    {
      path: "detail",
      element: <MainDetail />,
    },
  ],
};
export default mainRoutes;

5. ./router/userRoutes.tsx

import type { RouteObject } from "react-router";
import { lazy } from "react";

const UserLayout = lazy(() => import("@/pages/User/Layout"));

const UserInfo = lazy(() => import("@/pages/User/UserInfo"));

/**
 * 用户信息模块路由
 */
const userRoutes: RouteObject = {
  path: "user",
  element: <UserLayout />,
  children: [
    {
      path: "info",
      element: <UserInfo />,
    },
  ],
};

export default userRoutes;

6. Layout.tsx

import { Outlet } from "react-router-dom";

const Layout = () => {
  return <Outlet />;
};

export default Layout;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2036893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第335题路径交叉

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isSelfCrossing(int[] distance) {int n distance.length;// 处理第 1 种情况int i 0;while (i < n && (i < 2 || distance[i] > distance[i - 2])) {i;}if (i n) {return false;}// 处…

Adobe Substance 3D Painter v10.0.1 解锁版下载安装教程 (3D绘画软件)

前言 Adobe Substance 3D Painter 简称 Pt&#xff0c;是一款由adobe公司新研发的3D绘画软件。 Substance 3D Painter具有前所未有的功能和工作流程改进&#xff0c;使为 3D 资产创建纹理变得比以往更容易。 一、下载地址 下载链接&#xff1a;分享文件&#xff1a;Adobe Su…

Leetcode JAVA刷刷站(20)有效的括号

一、题目概述 二、思路方向 在Java中&#xff0c;要判断一个仅包含括号&#xff08;(, ), {, }, [, ]&#xff09;的字符串是否有效&#xff0c;你可以使用栈&#xff08;Stack&#xff09;数据结构来实现。栈是一种后进先出&#xff08;LIFO, Last In First Out&#xff09;的…

排序算法之梳排序

title: 梳排序 date: 2024-7-30 14:46:27 0800 categories: 排序算法 tags:排序算法梳排序 description: 梳排序&#xff08;Comb Sort&#xff09;是一种由弗拉基米尔多博舍维奇&#xff08;Wlodzimierz Dobosiewicz&#xff09;于1980年所发明的不稳定排序算法&#xff0c;并…

无字母绕过webshell

目录 代码 payload构造 php7 php5 构造payload 代码 不可以使用大小写字母、数字和$然后实现eval的注入执行 <?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code))…

工业边缘网关软件 NeuronEX 中基于角色的访问控制功能

随着企业数字化转型的不断深入&#xff0c;确保数据和信息安全变得日益重要。传统的访问控制方法往往需要为每个用户单独配置权限&#xff0c;这种方法管理复杂且漏洞百出&#xff0c;难以适应快速变化的业务需求。而基于角色的访问控制&#xff08;RBAC&#xff09;功能通过定…

主任务控制子任务通信流程

#define WM_TAKE_STOCK_CMD 172 //MAIN->TAKE 任务流程#define TAKE_STOCK_CMD_FIND_TRAY 1 // 找托盘 #define WM_TAKE_STOCK_CMD_EXC 173 //TAKE内部使用#define TAKE_STOCK_EXE_OK 0 #define WM_TAKE_STOCK_TASK_MSG 174 //MAIN->TAKE 发送…

数据结构+图的基本应用

一、问题描述 求有向图的简单路径 编写一个程序&#xff0c;设计相关算法完成以下功能。 &#xff08;1&#xff09;输出如图所示的有向图 G 从顶点 5 到顶点 2 的所有简单路径。 &#xff08;2&#xff09;输出如图所示的有向图 G 从顶点 5 到顶点 2 的所有长度为 3 的简单…

Qt编译配置OpenCV+opencv_contrib(使用cmake)

本文使用环境 OpenCV: 4.7.0 cmake: 3.30.2 Qt: 5.12.1一、配置环境变量 安装好OpenCV、Qt、cmake后&#xff0c;应配置好一下环境变量&#xff1a; 二、编译OpenCV 打开cmake&#xff0c;编译的源码路径选择opencv文件夹中的sources目录&#xff0c;在opencv文件夹下新建一…

代码随想录 day 38 动态规划

第九章 动态规划part06 322. 零钱兑换 如果求组合数就是外层for循环遍历物品&#xff0c;内层for遍历背包。 如果求排列数就是外层for遍历背包&#xff0c;内层for循环遍历物品。 这句话结合本题 大家要好好理解。 视频讲解&#xff1a;https://www.bilibili.com/video/BV14K…

【自用】Python爬虫学习(六):通过m3u8文件下载ts文件并合并为.mp4文件

Python爬虫学习&#xff08;六&#xff09; 下载视频&#xff08;简单版&#xff09;的步骤介绍第一步&#xff1a;在网页上找到.m3u8文件第二步&#xff1a;通过.m3u8文件下载对应的.ts视频文件第三步&#xff1a;依据.m3u8文件合并.ts文件为一个.mp4文件 下载视频&#xff08…

stm32智能颜色送餐小车(oled显示压力传感器重量)

大家好啊&#xff0c;我是情谊&#xff0c;今天我们来介绍一下我最近设计的stm32产品&#xff0c;我们在今年七月份的时候参加了光电设计大赛&#xff0c;我们小队使用的就是stm32的智能送餐小车&#xff0c;虽然止步于省赛&#xff0c;但是还是一次成长的经验吧&#xff0c;那…

PyQt编程快速上手

Python GUI安装 GUI就是图形用户界面的意思&#xff0c;在Python中使用PyQt可以快速搭建自己的应用&#xff0c;使得自己的程序看上去更加高大上&#xff0c;学会GUI编程可以使得自己的软件有可视化的结果。 如果你想用Python快速制作界面&#xff0c;可以安装PyQt&#xff1a…

Linux云计算 |【第二阶段】NETWORK-DAY6

主要内容&#xff1a; 企业网络综合项目分析、大型企业网络搭建 项目案例1 一家网络公司&#xff0c;有若干服务器&#xff0c;通过NAT技术将业务服务器与Internet互联&#xff1b;已有技术&#xff1a; ① 默认路由&#xff1a;实现到互联网数以万计网络访问的简化配置&…

Elasticsearch自动补全功能实践与Java API应用

Elasticsearch是一个强大的搜索引擎&#xff0c;它不仅支持全文搜索&#xff0c;还提供了自动补全功能&#xff0c;可以显著提升用户体验。自动补全功能允许用户在输入查询时实时显示建议项&#xff0c;帮助用户快速找到所需信息。本文将介绍如何使用Elasticsearch的RestHighLe…

配置Google API,用JavaScript和Python读取Google sheet里的数据

[发布时间是2024年8月。技术流程可能会存在一些变动] 源代码可以参考&#xff1a;victorspaceRMW/Read-Google-Sheet-with-API: The source code to read the Google Sheet with Google cloud API (github.com) 开头提醒一下各位公司&#xff0c;国内包括腾讯云华为云阿里云&…

echarts使图表组件根据屏幕尺寸变更而重新渲染大小

效果图&#xff1a; 通过 window.addEventListener(resize, this.resizeChart); 实现 完整代码&#xff1a; <template><div class"dunBlock"><div class"char2" id"char2" ref"chart"></div></div…

《光与夜之恋》3D建模含量超标,纯炫技还是释放新信号?

继叠纸的《恋与深空》之后&#xff0c;腾讯的《光与夜之恋》也卷起3D技术了。 《光与夜之恋》即将在8月12日上线的限定活动“大漠归墟”最新PV及男主六星卡面释出&#xff0c;相对于褒贬不一、引起争论的卡面美术&#xff0c;PV中的3D建模倒是收获了玩家的集体好评。 “大漠归…

读零信任网络:在不可信网络中构建安全系统18零信任代理

1. 零信任代理 1.1. 零信任代理是应用级代理服务器&#xff0c;用来保护零信任网络&#xff0c;它是处理认证、授权以及加密的基础设施 1.2. 零信任代理分为反向代理和前向代理两种工作模式 1.2.1. 运行时可以同时采用这两种工作模式&#xff0c;也可以只采用其中的一种 1.2…

libcurl8.9.1 上传json

在postman中 PUT----》body----》raw----》json 结构体定义&#xff1a; #define MAX_ARRAY_SIZE 5*1024*1024struct SMART_DATA_CACHE {char* buf;long dwTotalLen;SMART_DATA_CACHE(){dwTotalLen 0;buf nullptr;while (!buf) {try {buf new char[MAX_ARRAY_SIZE];}c…