react关于手搓antd pro面包屑的经验(写的不好请见谅)

news2025/2/8 2:15:32

我们先上代码,代码里面都有注释,我是单独写了一个组件,方便使用,在其他页面引入就行了

还使用了官方的Breadcrumb组件

import React, { useEffect, useState } from 'react';
import { Breadcrumb, Button } from 'antd';
import { useLocation, NavLink, useNavigate } from 'react-router-dom';

// 定义面包屑项的类型
interface LocaItem {
  path: string;
  title: string;
}

interface CustomBreadcrumbProps {
  title: string; // 当前页面的标题,动态传递
}

const CustomBreadcrumb: React.FC<CustomBreadcrumbProps> = ({ title }) => {
  const navigate = useNavigate();
  const location = useLocation();
  const [loca, setLoca] = useState<LocaItem[]>([]);

  useEffect(() => {
    // 获取存储的面包屑数据
    const storedLoca = JSON.parse(sessionStorage.getItem('loca') || '[]');

    // 创建新面包屑项
    const newObject: LocaItem = {
      path: location.pathname,
      title: title, // 使用传入的 title 作为当前页面的标题
    };

    // 判断 loca 中是否有相同的 title
    const isExist = storedLoca.some((item: LocaItem) => item.title === newObject.title);

    // 如果不存在相同的 title,就 push 新对象
    if (!isExist) {
      storedLoca.push(newObject);
      sessionStorage.setItem('loca', JSON.stringify(storedLoca)); // 存储新的面包屑数据
    }

    setLoca(storedLoca); // 更新组件状态
  }, [location.pathname, title]); // 每次路径或标题变化时,更新面包屑

  // 删除面包屑项
  const handleRemove = (path: string) => {
    console.log(location.pathname);
    console.log(path);
    // 检查路径是否相同
    if (location.pathname === path) {
      const pathlink = JSON.parse(sessionStorage.getItem('loca') || '[]');
      const pathlinkLength = pathlink.length - 1;

      if (path === pathlink[pathlinkLength].path) {
        const newPath = String(pathlink[pathlinkLength - 1]?.path);

        // 延迟跳转,确保状态更新后执行
        setTimeout(() => {
          navigate(newPath || '/'); // 如果路径为空,跳转到默认页面
        }, 0);
      } else {
        const newPath = String(pathlink[pathlinkLength - 2]?.path);

        // 延迟跳转,确保状态更新后执行
        setTimeout(() => {
          navigate(newPath || '/'); // 如果路径为空,跳转到默认页面
        }, 0);
      }
    }

    // 更新面包屑数据
    const updatedLoca = loca.filter((item) => item.path !== path);
    sessionStorage.setItem('loca', JSON.stringify(updatedLoca)); // 更新 sessionStorage
    setLoca(updatedLoca); // 更新状态
  };

  // 渲染面包屑项
  const breadcrumbItems = loca.map((item: LocaItem) => ({
    title: (
      <span style={
  
  { display: 'flex', alignItems: 'center', marginLeft: '10px' }}>
        <NavLink
          to={item.path}
          style={({ isActive }) => ({
            fontWeight: isActive ? 'bold' : 'normal', // 高亮显示
            color: isActive ? '#1890FF' : 'normal', // 当前项文字颜色
            backgroundColor: isActive ? '#e6f7ff' : 'normal', // 当前项背景颜色
            borderBottom: isActive ? '1px solid #1890FF' : 'normal',
            borderRadius: '0',
            height: '30px',
            lineHeight: '30px',
            padding: '0 10px 0 10px',
          })}
        >
          {item.title}
        </NavLink>
        {/* 关闭按钮 */}
        <Button
          onClick={() => handleRemove(item.path)} // 点击删除当前面包屑项
          disabled={item.title === "首页"} // 禁用“首页”按钮
          type="link"
          icon={<span style={
  
  { fontSize: '16px' }}>×</span>}
          style={
  
  {
            padding: 0,
            fontSize: '16px',
            display: item.title === "首页" ? 'none' : 'block',
            width: '20px',
            margin: item.title === "首页" ? '0 5px 0 0' : '0',
          }}
        />
      </span>
    ),
  }));

  return (
    <Breadcrumb
      style={
  
  {
        margin: '16px 0',
        height: '30px',
      }}
      items={breadcrumbItems} // 使用动态生成的面包屑项
      separator="" // 去掉默认的斜杠分隔符
      itemRender={(route) => {
        return (
          <span style={
  
  { marginRight: '10px',whiteSpace:'nowrap' }}>{route.title}</span> // 给每个面包屑项加间距
        );
      }}
    />
  );
};

export default CustomBreadcrumb;

然后在其他页面引入

import Breadcrumbs from '../../../src/components/Breadcrumb/Breadcrumb';

使用:

title是面包屑的名称,你也可以获取当前路由的title,写个动态的

<Breadcrumbs title="需求管理" />

效果:

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

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

相关文章

[含文档+PPT+源码等]精品大数据项目-Django基于大数据实现的心血管疾病分析系统

大数据项目-Django基于大数据实现的心血管疾病分析系统背景可以从以下几个方面进行阐述&#xff1a; 一、项目背景与意义 1. 心血管疾病现状 心血管疾病是当前全球面临的主要健康挑战之一&#xff0c;其高发病率、高致残率和高死亡率严重威胁着人类的生命健康。根据权威机构…

【Rust自学】19.5. 高级类型

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 19.5.1.使用newtype模式实现类型安全和抽象 在 19.2. 高级trait 中&#xff08;具体来说是…

113,【5】 功防世界 web unseping

进入靶场 代码审计 <?php // 高亮显示当前 PHP 文件的源代码&#xff0c;方便开发者查看代码结构和内容 highlight_file(__FILE__);// 定义一个名为 ease 的类 class ease {// 私有属性 $method&#xff0c;用于存储要调用的方法名private $method;// 私有属性 $args&…

leetCode刷题-图、回溯相关

岛屿数量 class Solution { private:int mi;int mj; public:int numIslands(vector<vector<char>>& grid) {mi grid.size() - 1; // i的范围 0~mimj grid[0].size() - 1; // j的范围 0~mjint landnum 0;bool sea false;do {pair<int, int> res …

Windows编程:下载与安装 Visual Studio 2010

本节前言 在写作本节的时候&#xff0c;本来呢&#xff0c;我正在写的专栏&#xff0c;是 MFC 专栏。而 VS2010 和 VS2019&#xff0c;正是 MFC 学习与开发中&#xff0c;可以使用的两款软件。然而呢&#xff0c;如果你去学习 Windows API 知识的话&#xff0c;那么&#xff0…

OpenEuler学习笔记(十八):搭建企业云盘服务

要在 OpenEuler 上搭建企业云盘&#xff0c;可借助一些开源软件来实现&#xff0c;以下以 Nextcloud 为例详细介绍搭建步骤。Nextcloud 是一款功能丰富的开源云存储解决方案&#xff0c;支持文件共享、同步、协作等多种功能。 1. 系统环境准备 确保 OpenEuler 系统已更新到最…

什么是三层交换技术?与二层有什么区别?

什么是三层交换技术&#xff1f;让你的网络飞起来&#xff01; 一. 什么是三层交换技术&#xff1f;二. 工作原理三. 优点四. 应用场景五. 总结 前言 点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有惊喜。 作者&#xff1a;神的孩子都在歌唱 大家好…

Ollama+deepseek+Docker+Open WebUI实现与AI聊天

1、下载并安装Ollama 官方网址&#xff1a;Ollama 安装好后&#xff0c;在命令行输入&#xff0c; ollama --version 返回以下信息&#xff0c;则表明安装成功&#xff0c; 2、 下载AI大模型 这里以deepseek-r1:1.5b模型为例&#xff0c; 在命令行中&#xff0c;执行&…

Linux生成自签证书【Nginx】

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

网络安全 | 加密技术揭秘:保护数据隐私的核心

网络安全 | 加密技术揭秘&#xff1a;保护数据隐私的核心 一、前言二、对称加密技术2.1 原理2.2 优点2.3 缺点2.4 应用场景 三、非对称加密技术3.1 原理3.2 优点3.3 缺点3.4 应用场景 四、哈希函数4.1 原理4.2 优点4.3 缺点4.4 应用场景 五、数字签名5.1 原理5.2 优点5.3 缺点5…

使用服务器部署DeepSeek-R1模型【详细版】

文章目录 引言deepseek-r1IDE或者终端工具算力平台体验deepseek-r1模型总结 引言 在现代的机器学习和深度学习应用中&#xff0c;模型部署和服务化是每个开发者面临的重要任务。无论是用于智能推荐、自然语言处理还是图像识别&#xff0c;如何高效、稳定地将深度学习模型部署到…

DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区

Direct3D 11 总结 —— 4 绘制三角形_direct绘制三角形-CSDN博客 DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区 - X_Jun - 博客园 练习题 粗体字为自定义题目 尝试交换三角形第一个和第三个顶点的数据&#xff0c;屏幕将显示什么&#xff1f;为什么&…

第二次连接k8s平台注意事项

第二次重新打开集群平台 1.三台机子要在VMware打开 2.MobaBXterm连接Session 3.三个机子docker重启 systemctl restart docker4.主节点进行平台链接 docker pull kubeoperator/kubepi-server[rootnode1 home]# docker pull kubeoperator/kubepi-server [rootnode1 home]# # 运…

Mybatis篇

1&#xff0c;什么是Mybatis &#xff08; 1 &#xff09;Mybatis 是一个半 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了 JDBC&#xff0c;开发时只需要关注 SQL 语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁…

三维粒子滤波(Particle Filter)MATLAB例程,估计三维空间中匀速运动目标的位置(x, y, z),提供下载链接

三维粒子滤波(Particle Filter)MATLAB例程,估计三维空间中匀速运动目标的位置(x, y, z) 文章目录 介绍功能运行结果代码介绍 本 MATLAB 代码实现了三维粒子滤波( P a r t i c l e F i l t e

设计模式Python版 享元模式

文章目录 前言一、享元模式二、享元模式示例 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a;关注类和对象之间的组合&…

从0开始,来看看怎么去linux排查Java程序故障

一&#xff0c;前提准备 最基本前提&#xff1a;你需要有liunx环境&#xff0c;如果没有请参考其它文献在自己得到local建立一个虚拟机去进行测试。 有了虚拟机之后&#xff0c;你还需要安装jdk和配置环境变量 1. 安装JDK&#xff08;以OpenJDK 17为例&#xff09; 下载JDK…

【MySQL】centos 7 忘记数据库密码

vim /etc/my.cnf文件&#xff1b; 在[mysqld]后添加skip-grant-tables&#xff08;登录时跳过权限检查&#xff09; 重启MySQL服务&#xff1a;sudo systemctl restart mysqld 登录mysql&#xff0c;输入mysql –uroot –p&#xff1b;直接回车&#xff08;Enter&#xff09; 输…

区块链项目孵化与包装设计:从概念到市场的全流程指南

区块链技术的快速发展催生了大量创新项目&#xff0c;但如何将一个区块链项目从概念孵化成市场认可的产品&#xff0c;是许多团队面临的挑战。本文将从孵化策略、包装设计和市场落地三个维度&#xff0c;为你解析区块链项目成功的关键步骤。 一、区块链项目孵化的核心要素 明确…

【数据科学】一个强大的金融数据接口库:AKShare

文章目录 1. AKShare 简介2. 安装 AKShare3. AKShare 核心功能3.1 获取股票数据3.2 获取股票实时数据3.3 获取基金数据3.4 获取期货数据3.5 获取外汇数据3.6 获取数字货币数据 4. 数据处理与存储5. 实战案例6. 总结 AKShare 是一个开源的金融数据接口库&#xff0c;它提供了简单…