当前位置: 首页 > news >正文

react + antd 实现后台管理系统

文章目录

            • 完整路由搭建
            • Layout 和 Aside组件引入 Antd
            • Aside组件实现


项目效果图
在这里插入图片描述
在这里插入图片描述

项目完整代码地址

https://gitee.com/lyh1999/react-back-management
项目完整代码地址

react依赖安装 最好采用yarn 安装

react-router 安装依赖

配置路由

history模式 /

// src/router/index.jsx
import { createBrowserRouter } from "react-router-dom";
import Home from "../views/Home";
import Login from "../views/Login";const router = createBrowserRouter([{path:'/',element: <Home />,},{path:'/login',element: <Login />,}
])export default router

hash模式 #

// src/router/index.jsx
import { createHashRouter } from "react-router-dom";
import Home from "../views/Home";
import Login from "../views/Login";const router = createHashRouter([{path: "/",element: <Home />,},{path: "/login",element: <Login />,},
]);export default router;

basename 设置子路由的前缀

创建router路由文件

import { createBrowserRouter } from "react-router-dom";
import Main from "../pages/main";
import Home from "../pages/home";const routes = [{path: "/",Component: Main,children: [{path: "/home",Component: Home,}],},
];export default createBrowserRouter(routes);

创建main.js main组件 这里可以挂载子路由出口Outlet

import React from 'react'
// 引入子路由出口
import {Outlet} from 'react-router-dom'const Main = () => {return (<div><h1>main</h1><Outlet/></div>)
}export default Main

创建子路由home组件

import React from "react";import './home.css'
const Home = () => {return (<div><h1>Home</h1></div>);
}export default Home;

App.js挂载路由router RouterProvider

import "./App.css";
import { RouterProvider } from "react-router-dom";
import router from "./router/index";function App() {return (<div className="App"><RouterProvider router={router} /></div>);
}export default App;

导入完整路由组件

import { createBrowserRouter } from "react-router-dom";
import Main from "../pages/main";
import Home from "../pages/home";
import Mall from "../pages/mall";
import User from "../pages/user";const routes = [{path: "/",Component: Main,children: [{path: "/home",Component: Home,},{path: "/user",Component: User,},{path: "/mall",Component: Mall,}],},
];export default createBrowserRouter(routes);

改为懒加载

import { createBrowserRouter, lazy, Suspense } from "react-router-dom";
import Main from "../pages/main"; // 主布局组件可以提前加载// 使用 React.lazy 动态导入组件
const Home = lazy(() => import("../pages/home"));
const Mall = lazy(() => import("../pages/mall"));
const User = lazy(() => import("../pages/user"));const routes = [{path: "/",element: <Main />,children: [{path: "home", // 注意:子路由路径不需要以斜杠开头element: (<Suspense fallback={<div>Loading...</div>}><Home /></Suspense>),},{path: "user",element: (<Suspense fallback={<div>Loading...</div>}><User /></Suspense>),},{path: "mall",element: (<Suspense fallback={<div>Loading...</div>}><Mall /></Suspense>),},],},
];export default createBrowserRouter(routes);

添加完整路由组件 mall user pageOne pageTwo

完整路由搭建

代码

import { createBrowserRouter, Navigate } from "react-router-dom";
import { Suspense, lazy } from "react";
import Main from "../pages/main"; // 主布局组件可以提前加载// 使用 React.lazy 动态导入组件
const Home = lazy(() => import("../pages/home"));
const Mall = lazy(() => import("../pages/mall"));
const User = lazy(() => import("../pages/user"));
const PageTwo = lazy(() => import("../pages/other/pageTwo"));
const PageOne = lazy(() => import("../pages/other/pageOne"));const routes = [{path: "/",element: <Main />,children: [// 路由重定向{path: "/",element: <Navigate to={"/home"} replace />,},{path: "home", // 注意:子路由路径不需要以斜杠开头element: (<Suspense fallback={<div>Loading...</div>}><Home /></Suspense>),},{path: "user",element: (<Suspense fallback={<div>Loading...</div>}><User /></Suspense>),},{path: "mall",element: (<Suspense fallback={<div>Loading...</div>}><Mall /></Suspense>),},{path: "other",children:[{path: "pageOne",element: (<Suspense fallback={<div>Loading...</div>}><PageOne /></Suspense>)},{path: "pageTwo",element: (<Suspense fallback={<div>Loading...</div>}><PageTwo /></Suspense>)}]}],},
];export default createBrowserRouter(routes);
Layout 和 Aside组件引入 Antd
npm install antd

复制官网的Layout 代码到main.js

import React, { useState } from "react";
// 引入子路由出口
import { Outlet } from "react-router-dom";
import {DesktopOutlined,FileOutlined,PieChartOutlined,TeamOutlined,UserOutlined,
} from "@ant-design/icons";
import { Breadcrumb, Layout, Menu, theme } from "antd";
const { Header, Content, Footer, Sider } = Layout;const items = [getItem("Option 1", "1", <PieChartOutlined />),getItem("Option 2", "2", <DesktopOutlined />),getItem("User", "sub1", <UserOutlined />, [getItem("Tom", "3"),getItem("Bill", "4"),getItem("Alex", "5"),]),getItem("Team", "sub2", <TeamOutlined />, [getItem("Team 1", "6"),getItem("Team 2", "8"),]),getItem("Files", "9", <FileOutlined />),
];function getItem(label, key, icon, children) {return {key,icon,                 children,label,};
}const Main = () => {const [collapsed, setCollapsed] = useState(false);const {token: { colorBgContainer, borderRadiusLG },} = theme.useToken();return (<Layout style={{ minHeight: "100vh" }}><Sidercollapsiblecollapsed={collapsed}onCollapse={(value) => setCollapsed(value)}><div className="demo-logo-vertical" /><Menutheme="dark"defaultSelectedKeys={["1"]}mode="inline"items={items}/></Sider><Layout><Header style={{ padding: 0, background: colorBgContainer }} /><Content style={{ margin: "0 16px" }}><Breadcrumb style={{ margin: "16px 0" }}><Breadcrumb.Item>User</Breadcrumb.Item><Breadcrumb.Item>Bill</Breadcrumb.Item></Breadcrumb><divstyle={{padding: 24,minHeight: 360,background: colorBgContainer,borderRadius: borderRadiusLG,}}>Bill is a cat.</div></Content><Footer style={{ textAlign: "center" }}>Ant Design ©{new Date().getFullYear()} Created by Ant UED</Footer></Layout></Layout>);
};export default Main;

组件抽离 将side组件抽取出来

import React, { useState } from "react";
import { Layout, Menu } from "antd";
import {DesktopOutlined,FileOutlined,PieChartOutlined,TeamOutlined,UserOutlined,
} from "@ant-design/icons";const { Sider } = Layout;const items = [getItem("Option 1", "1", <PieChartOutlined />),getItem("Option 2", "2", <DesktopOutlined />),getItem("User", "sub1", <UserOutlined />, [getItem("Tom", "3"),getItem("Bill", "4"),getItem("Alex", "5"),]),getItem("Team", "sub2", <TeamOutlined />, [getItem("Team 1", "6"),getItem("Team 2", "8"),]),getItem("Files", "9", <FileOutlined />),
];function getItem(label, key, icon, children) {return {key,icon,children,label,};
}const CommonAside = () => {const [collapsed, setCollapsed] = useState(false);return (<Sidercollapsiblecollapsed={collapsed}onCollapse={(value) => setCollapsed(value)}><h3 style={{ margin: 16, color: "white" }}>通用后台管理系统</h3><Menutheme="dark"defaultSelectedKeys={["1"]}mode="inline"items={items}/></Sider>);
};export default CommonAside;
import React from "react";
// 引入子路由出口
import { Outlet } from "react-router-dom";
import { Breadcrumb, Layout, theme } from "antd";
import CommonAside from "../components/commonAside";
const { Header, Content, Footer } = Layout;const Main = () => {const {token: { colorBgContainer, borderRadiusLG },} = theme.useToken();return (<Layout style={{ minHeight: "100vh" }}><CommonAside /><Layout><Header style={{ padding: 0, background: colorBgContainer }} /><Content style={{ margin: "0 16px" }}><Breadcrumb style={{ margin: "16px 0" }}><Breadcrumb.Item>User</Breadcrumb.Item><Breadcrumb.Item>Bill</Breadcrumb.Item></Breadcrumb><divstyle={{padding: 24,minHeight: 360,background: colorBgContainer,borderRadius: borderRadiusLG,}}>Bill is a cat.</div></Content><Footer style={{ textAlign: "center" }}>Ant Design ©{new Date().getFullYear()} Created by Ant UED</Footer></Layout></Layout>);
};export default Main;
Aside组件实现
export default [{path: '/home',name: 'home',label: '首页',icon: 'HomeOutlined',url: '/home/index'},{path: '/mall',name: 'mall',label: '商品管理',icon: 'ShopOutlined',url: '/mall/index'},{path: '/user',name: 'user',label: '用户管理',icon: 'UserOutlined',url: '/user/index'},{path: '/other',label: '其他',icon: 'SettingOutlined',children: [{path: '/other/pageOne',name: 'page1',label: '页面1',icon: 'SettingOutlined'},{path: '/other/pageTwo',name: 'page2',label: '页面2',icon: 'SettingOutlined'}]}]
import React, { useState } from "react";
import { Layout, Menu } from "antd";
import * as Icon from "@ant-design/icons";
import MenuConfig from "../../config/index";const { Sider } = Layout;// 动态获取icon
const iconToElement = (iconName) => React.createElement(Icon[iconName]);// 处理菜单数据  items项设置必须要有key  icon  label
const menuItems = MenuConfig.map((item) => {// 没有子菜单const child = {key: item.path,icon: iconToElement(item.icon),label: item.label,};//  有子菜单if (item.children) {child.children = item.children.map((child) => {return {key: child.path,icon: iconToElement(child.icon),label: child.label,};});}return child;
});const CommonAside = () => {const [collapsed, setCollapsed] = useState(false);return (<Sidercollapsiblecollapsed={collapsed}onCollapse={(value) => setCollapsed(value)}><h3 style={{ margin: 16, color: "white" }}>通用后台管理系统</h3><Menutheme="dark"defaultSelectedKeys={["1"]}mode="inline"items={menuItems}/></Sider>);
};export default CommonAside;
http://www.xdnf.cn/news/251551.html

相关文章:

  • TS 常用类型
  • C++-Lambda表达式
  • MySQL 窗口函数
  • 使用conda安装Python库包报错:module ‘libmambapy‘ has no attribute ‘QueryFormat‘
  • SpringBoot实现条件分页
  • ROPE(旋转位置编码)简述
  • 数据库性能杀手与调优实践
  • 第十六届蓝桥杯单片机组省赛(第一套)
  • 解决 3D Gaussian Splatting 中 SIBR 可视化组件报错 uv_mesh.vert 缺失问题【2025最新版!】
  • 基于深度学习的毒蘑菇检测
  • 大学生入学审核系统设计与实现【基于SpringBoot + Vue 前后端分离技术】
  • 精益数据分析(38/126):SaaS模式的流失率计算优化与定价策略案例
  • ubuntu22.04安装显卡驱动与cuda+cuDNN
  • IntelliJ IDEA 使用教程
  • Linux:信号(一)
  • 八闽十三张模块部署测试记录:源码结构拆解与本地运行验证(含常见问题与修复指南)
  • c/c++开发调试工具之gdb
  • 每天学一个 Linux 命令(34):wc
  • DeepSeek R1:强化学习范式的推理强化模型
  • 华为OD机试真题 Java 实现【水库蓄水问题】
  • 【Linux深入浅出】之全连接队列及抓包介绍
  • 供应链算法整理(一)--- 销量预估
  • 云计算-容器云-服务网格Bookinfo
  • 大模型的第一天学习-LM studio的安装和本地大模型搭建
  • 从0开始建立Github个人博客(hugoPaperMod)
  • 见多识广4:Buffer与Cache,神经网络加速器的Buffer
  • A2A Python 教程 - 综合指南
  • 体系结构论文(八十二):A Comprehensive Analysis of Transient Errors on Systolic Arrays
  • 目标检测中的损失函数(三) | SIoU WIoUv1 WIoUv2 WIoUv3
  • 【计算机视觉】三维视觉:Open3D:现代三维数据处理的全栈解决方案