react 项目路由配置(react-router-dom 版本 v6.3、v6.4)

embedded/2024/9/23 14:30:30/

根据 react-router-dom 的版本,有不同的方式

一、react-router-dom v6.3

用到的主要 api:

  • BrowserRouter
  • useRoutes
  • Outlet

下面是详细步骤:

1、index.js

  • BrowserRouter 用来实现 单页的客户端路由
  • 使用 BrowserRouter 包裹 App
  • 放在 顶级 位置,重要!!
  • 支持嵌套路由,用于 history 模式
  • hash 模式使用 HashRouter
import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
import { BrowserRouter } from "react-router-dom";const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<BrowserRouter><React.StrictMode><App /></React.StrictMode></BrowserRouter>
);// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

如果遇到下图这种报错,就是没有将 BrowserRouter 像上图一样放在 顶级,一定要放顶级!

在这里插入图片描述

2、routes.js

用 数组 描述路由,包含必要参数 pathelementchildren

例如:

import { UserOutlined } from "@ant-design/icons";
import Abroad from "./pages/Abroad";
import Domestic from "./pages/Domestic";
import Layout from "./layout/index";
import { Navigate } from "react-router-dom";const routes = [{title: "平台管理",path: "/manage",element: <Layout />,icon: <UserOutlined />,children: [{title: "境内平台管理",path: "/manage/domestic",element: <Domestic />,icon: <UserOutlined />,},{title: "境外平台管理",path: "/manage/abroad",element: <Abroad />,icon: <UserOutlined />,},],},{path: "/",element: <Navigate to="/manage/domestic" />,},
];export default routes;

3、App.js

使用 useRoutes 渲染出一级路由,参数即为我们在上一步的路由数组

  • useRoutes 是 react-router-dom 库中提供的一个 Hook,用于 基于路由配置生成路由匹配器(Router Matcher)的方法
  • useRoutes 接收的路由配置对象应该是一个由 若干个路由配置组成的数组,每个路由配置包含以下属性:
    • path:字符串类型,表示 URL 路径匹配规则;
    • element:React 组件,表示如果 URL 匹配成功后要显示的组件;
    • children:嵌套子路由的路由配置数组。
import React from "react";
import { useRoutes } from "react-router-dom";
import routes from "./routes";const App = () => {const element = useRoutes(routes);return <>{element}</>;
};export default App;

4、layout.jsx

实际场景,如后台管理项目,需要展示多级路由,我们一般会创建一个layout文件

  • 按照 左 Menu右 Content 的设定来举例
  • 嵌套的二级路由,使用 outlet 渲染(类似于vue中的 <router-view>
  • 例子中,包含了一些菜单处理的代码,如递归渲染、默认选中,可选择性观看
import React, { useState } from "react";
import { MenuFoldOutlined, MenuUnfoldOutlined } from "@ant-design/icons";
import { Layout, Menu, Button, theme } from "antd";
import { Outlet, useNavigate, useLocation } from "react-router-dom";
import routes from "../routes/index";const { Header, Sider, Content } = Layout;// Menu格式处理
function getMenu(rout) {const rs = rout.map((item) => {return {label: item.title,key: item.path,icon: item.icon,children: item.children && getMenu(item.children),};});return rs;
}// 递归层级
function findParents(key, tree) {let parents = [];function findParent(nodes, key) {for (let node of nodes) {if (node.path === key) {return true;}if (node.children && findParent(node.children, key)) {parents.push(node.path);return true;}}return false;}findParent(tree, key);parents.push(key);return parents;
}// 获取当前路由所在层级
function getOpenKeys(pathname, list) {if (!pathname) return ["/manage", "/manage/domestic"];let keys = findParents(pathname, list);return keys;
}const App = () => {const [collapsed, setCollapsed] = useState(false);const {token: { colorBgContainer, borderRadiusLG },} = theme.useToken();// 递归获取有效菜单项const list = routes.filter((item) => item.title);const items = getMenu(list);// 菜单,默认展开、选中处理const location = useLocation();const keys = getOpenKeys(location.pathname, list);const defaultSelectedKeys = keys;const defaultOpenKeys = keys;// 跳转let navigate = useNavigate();function handleClick(e) {navigate(e.key);}return (<Layout><Sider trigger={null} collapsible collapsed={collapsed}><div style={{ width: "100%", height: "80px" }}></div>{/* 菜单 */}<Menumode="inline"theme="dark"defaultSelectedKeys={defaultSelectedKeys}defaultOpenKeys={defaultOpenKeys}onClick={handleClick}items={items}></Menu></Sider><Layout><Headerstyle={{padding: 0,background: colorBgContainer,}}><Buttontype="text"onClick={() => setCollapsed(!collapsed)}style={{ marginBottom: 16 }}>{collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}</Button></Header><Contentstyle={{margin: "24px 16px",padding: 24,minHeight: 280,background: colorBgContainer,borderRadius: borderRadiusLG,overflowY: "auto",}}>{/* 二级路由 */}<Outlet /></Content></Layout></Layout>);
};
export default App;

v6.3 的版本,路由设置到此结束,接下来是 v6.4

二、react-router-dom v6.4

主要 api:

  • createBrowserRouter
  • RouterProvider
  • Outlet

在 v6.3 方案的基础上,换掉 index.js 和 App.js 即可

1、index.js

BrowserRouter 的使用去掉


import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";// v6.3 使用此API,v6.4使用会报错
// import { BrowserRouter } from "react-router-dom";const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(// <BrowserRouter><React.StrictMode><App /></React.StrictMode>// </BrowserRouter>
);// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

2、App.js

useRoutes 的使用去掉,增加 createBrowserRouterRouterProvider 的相关设置

  • createBrowserRouter 创建路由
  • 挂载到 RouterProviderrouter

import React from "react";
import routes from "./routes";// v6.3 userRoutes钩子
// import { useRoutes } from "react-router-dom";
// const App = () => {
//   const element = useRoutes(routes);
//   return <>{element}</>;
// };// v6.4 createBrowserRouter + RouterProvider
import { createBrowserRouter, RouterProvider } from "react-router-dom";
const router = createBrowserRouter(routes);
const App = () => {return (<><RouterProvider router={router} /></>);
};export default App;

然后就完成啦~


http://www.ppmy.cn/embedded/5814.html

相关文章

2024阿里云4核8G服务器租用优惠价格700元一年

阿里云4核8G服务器租用优惠价格700元1年&#xff0c;配置为ECS通用算力型u1实例&#xff08;ecs.u1-c1m2.xlarge&#xff09;4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选&#xff0c;CPU采用Intel(R) Xeon(R) Platinum处理器&#xff0c;阿里云优惠 aliyunfuwuqi…

网站结构规范对于独立站的重要性

网站结构是指通过优化网站的内部结构和布局&#xff0c;以提高其在搜索引擎结果页面&#xff08;SERP&#xff09;中的排名和可见性的过程。 涉及到网站内部链接、导航菜单、网站url路径、网站地图等细节。 网站结构的优化可以更好地帮助搜索引擎了索引网站的内容&#xff0c…

GVRP协议与动态、静态vlan

一、GVRP协议使用场景 1、当实际组网复杂到网络管理员无法短时间内了解网络的拓扑结构&#xff0c;或者是整个网络的VLAN太多时&#xff0c;工作量会非常大&#xff0c;而且非常容易配置错误。在这种情况下&#xff0c;用户可以通过GVRP的VLAN自动注册功能完成VLAN的配置。 2、…

MySQL事务

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;MySQL &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容介绍了MySQL中事务的概念&#xff0c;也是MySQL中非常重…

nodejs npm 常用的命令

大家好&#xff0c;我是资深前端之路&#xff0c;以下是自己对npm命令的回顾梳理。喜欢的朋友记得点赞关注收藏哟&#xff01; npm npm init :生成package.json文件。 npm -v:查看npm版本号。 npm i:下载对应的文件包。npm i 下载包名版本号&#xff0c;可以下载制定的版本…

政安晨:【深度学习神经网络基础】(十)—— 反向传播网络中计算输出节点增量与计算剩余节点增量

目录 简述 二次误差函数 交叉熵误差函数 计算剩余节点增量 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xf…

万界星空科技机器人组装行业MES系统

一、为什么选择万界星空科技&#xff1f; 万界星空科技作为一家在云MES系统的研发、生产自动化方面拥有很多年行业经验的科技型企业&#xff0c;多年来专注于云MES系统的研发与技术支持服务&#xff0c;目前已成为国内知名的智能制造整体解决方案提供商。 公司凝聚了一支经验…

如何配置 Nginx 作为 Jenkins 的反向代理并启用 SSL 加密

简介 默认情况下&#xff0c;Jenkins 自带内置的 Web 服务器&#xff0c;监听在 8080 端口上。这对于运行私有 Jenkins 实例或者只是需要快速启动而不关心安全性的用户来说很方便。但是一旦您的主机上有真实的生产数据&#xff0c;使用更安全的 Web 服务器&#xff08;如 Ngin…