react17+antd4.18 动态实现面包屑导航Breadcrumb-----需改善

这篇具有很好参考价值的文章主要介绍了react17+antd4.18 动态实现面包屑导航Breadcrumb-----需改善。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、已经定义好的全部的路由配置,需要是这种格式的,可以再加上关于icon的内容.

const routerMap = [
    {
        path: '/home',
        breadcrumbName: 'Home',
    },
    {
        path: '/page1',
        breadcrumbName: 'Page 1',
        children: [
            {
                path: '/page1/page101',
                breadcrumbName: 'Page 101',
                children: [
                    {
                        path: '/page1/page101/page10101',
                        breadcrumbName: 'Page 10101',
                    }, {
                        path: '/page1/page101/page10102',
                        breadcrumbName: 'Page 10102',
                    }
                ]
            }, {
                path: '/page1/page102',
                breadcrumbName: 'Page 102',
                children: [
                    {
                        path: '/page1/page102/page10201',
                        breadcrumbName: 'Page 10201',
                    }, {
                        path: '/page1/page102/page10202',
                        breadcrumbName: 'Page 10202',
                    }
                ]
            }
        ]
    }
]

2、代码

import React, { Component } from 'react'
import { Breadcrumb } from 'antd'
import { Link } from 'react-router-dom'
//1、已经定义好的全部的路由配置,需要是这种格式的,可以再加上关于icon的内容
const routerMap = [
    {
        path: '/home',
        breadcrumbName: 'Home',
    },
    {
        path: '/page1',
        breadcrumbName: 'Page 1',
        children: [
            {
                path: '/page1/page101',
                breadcrumbName: 'Page 101',
                children: [
                    {
                        path: '/page1/page101/page10101',
                        breadcrumbName: 'Page 10101',
                    }, {
                        path: '/page1/page101/page10102',
                        breadcrumbName: 'Page 10102',
                    }
                ]
            }, {
                path: '/page1/page102',
                breadcrumbName: 'Page 102',
                children: [
                    {
                        path: '/page1/page102/page10201',
                        breadcrumbName: 'Page 10201',
                    }, {
                        path: '/page1/page102/page10202',
                        breadcrumbName: 'Page 10202',
                    }
                ]
            }
        ]
    }
]
export default class Bread extends Component {
    state = {
        breadCrumb: [],//Breadcrumb.Item项数组
    }
    componentDidMount() {
        this.renderBreadcrumbItems()
    }
    //2、根据全部的路由配置和当前页面的路径筛选得到一个数组,这个数组是当前页面路径所对应的路由配置
    /* 对路由配置的每一项path与currentPath进行判断:
    先判断是否相等:
            相等:把该项的配置添加进routes数组中,包括path、breadcrumbName。
            不相等:再判断当前页面路径currentPath是否是以当前路径开头。
                    若是:证明currentPath在他的children中,把该项的路由配置添加进routes数组中,包括path、breadcrumbName、children的内容为递归调用函数,传入当前项的children为参数。
                    若不是:直接进行下一项。
    
    得到的数组需要进行翻转
    */
    getRoutesList = () => {
        const currentPath = this.props.pathname;//当前页面的路径
        const routes = [];//符合当前路径过程的路由配置数组
        // 闭包
        function fn(data) {
            data.forEach(item => {
                //先判相等 再判开头
                if (item.path === currentPath) {
                    //相等
                    routes.push({ path: item.path, breadcrumbName: item.breadcrumbName })
                } else {
                    if (currentPath.startsWith(item.path)) {
                        //不相等,但是是他的children
                        routes.push({ path: item.path, breadcrumbName: item.breadcrumbName, children: fn(item.children) })
                    }
                }

            })
        }
        fn(routerMap)
        return routes.reverse() //注意:这里要进行数组翻转
    }

    //3、根据筛选后的路由配置渲染Breadcrumb.Item:如果是最后一项则直接渲染文字文字内容,不是最后一项要渲染链接。
    renderBreadcrumbItems = () => {
        const routes = this.getRoutesList()
        const currentPath = this.props.pathname
        let breadCrumb = []
        const bread = (data) => {
            data.forEach(item => {
                const { path, breadcrumbName, children } = item;
                //判断是否是最后一项
                const isLast = path === currentPath  //true最后一项渲染文字,false渲染链接
                const i = <Breadcrumb.Item key={path}>
                    {isLast ? <span>{breadcrumbName}</span> : <Link to={path}>{breadcrumbName}</Link>}
                </Breadcrumb.Item>
                breadCrumb.push(i)
                if (children) {
                    bread(children)
                }
            })
        }
        bread(routes)
        this.setState({
            breadCrumb
        })
    }
    render() {
        return (
            <div>
                <Breadcrumb>
                    {this.state.breadCrumb}
                </Breadcrumb>
            </div>
        )
    }
}

3、在组件中使用的时候需要传入当前页面的路劲发作为Bread组件的属性。

<Bread pathname={this.props.location.pathname}></Bread>

4、假设当前页面的路径为 ‘/page1/page102/page10201’,经过上述操作筛选后得到的对应路径上的路由配置routes的值为:

routs=[
      {path: '/page1', breadcrumbName: 'Page 1', children: undefined},
      {path: '/page1/page102', breadcrumbName: 'Page 102', children: undefined},
      {path: '/page1/page102/page10201', breadcrumbName: 'Page 10201'}
]

5、关于startWith:
startsWith 是 JavaScript 中一个字符串方法,用于检测一个字符串是否以指定的子串开头。如果是,则返回 true;如果不是,则返回 false。

这个方法对于构建面包屑导航或任何需要判断路径是否以特定前缀开始的场景都非常有用。

const str = 'Hello, world!';  
const prefix = 'Hello';  
  
if (str.startsWith(prefix)) {  
  console.log('The string starts with "Hello".');  
} else {  
  console.log('The string does not start with "Hello".');  
}  
// 输出:The string starts with "Hello".

在路由匹配的上下文中,startsWith 可以用来检查当前路径是否以某个路由的路径开始。如果是这样,那么就可以认为该路由是当前路径的一个匹配项,并可能将其添加到面包屑导航中。

例如,如果你有一个路由对象,其 path 属性为 /home/profile,并且当前路径是 /home/profile/settings,那么调用 currentPath.startsWith(route.path) 将返回 true,因为当前路径确实以路由的路径开始。文章来源地址https://www.toymoban.com/news/detail-858075.html

到了这里,关于react17+antd4.18 动态实现面包屑导航Breadcrumb-----需改善的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 若依 vue前端 动态设置路由path不同参数 在页面容器里打开新页面(新路由),面包屑和标签页标题根据参数动态改变,面包屑多级标题,侧边栏对应菜单亮起

    因为是在vue源码的基础上进行修改,所以,就没有复制代码在文章上,采取的是截图对比源码和我修改的代码片段。要麻烦你们自己手敲了。 场景:在费用配置列表中,点击每一项的配置,都会在页面容器内部打开一个新页面,所以新页面的路径一样,根据传的参数不同,面

    2024年01月16日
    浏览(41)
  • Vue实现面包屑功能(el-breadcrumb)

    文章后面附效果图 数据结构 首先展示一下数据基础结构 红色框框是默认存在的数据,其他数据就是通过选中侧边栏菜单进行数据插入 关键数据字段为 path, meta 准备侧边栏 首先需要自己准备一个侧边栏 这边就不进行讲解,上个效果图 实现面包屑代码 效果图

    2024年02月11日
    浏览(27)
  • js面包屑,如何制作面包屑,什么是面包屑,又如何去理解面包屑是什么呢,对于不会应该怎么办呢?这篇文章告诉你。

    🙂博主:锅盖哒 🙂文章核心: 带你了解原生js面包屑框架 目录大纲 1.面包屑的概念与框架地址 2.功能框架预览于介绍 框架效果预览: 页面架构代码预览: HTML页面预览:  权限验证介绍 3.面包屑的逻辑  下面就是面包屑逻辑 1.首先从login页面进入拿到渲染左侧列表的值 2

    2024年02月14日
    浏览(35)
  • 【前端版】分布式医疗云平台【解决面包屑的问题、定义路由、服务端接口、动态渲染菜单、登陆测试、字典类型管理 】(二十)

    目录 2.3.解决其它问题 2.3.1.面包屑的问题及控制台报错 3.登陆和加载菜单和后台关联问题 

    2024年02月12日
    浏览(38)
  • 面包屑导航是什么?面包屑导航为什么能够提高SEO?

    面包屑导航(Breadcrumb Navigation)是一种网站的导航方式,通常用于显示访问路径。它的名称来自童话故事《汉赛尔和格蕾特》中的场景,其中汉赛尔在森林中留下了面包屑,以便他们回到家。 在Web设计中,面包屑导航通常位于页面顶部或正文区域的页眉下方。它通常由多个链

    2024年02月13日
    浏览(53)
  • vue-router + element-plus实现面包屑导航栏和路由标签栏

    首先,先解释一下什么是面包屑导航栏和路由标签栏。 如下图所示,面包屑导航栏就是展示当前所处路由信息和父辈路由信息的导航栏,它的作用是提示用户当前页面所在位置;路由标签栏就类似于浏览器的标签栏,每个标签对应一个路由页面,点击该标签可以进入该路由页

    2023年04月23日
    浏览(37)
  • 自制Breadcrumb 面包屑

    使用场景: 当系统拥有超过两级以上的层级结构时 当需要告知用户『你在哪里』时 当需要向上导航的功能时

    2024年01月19日
    浏览(42)
  • UI组件-面包屑简介

    设计世界充满了与食物相关的类比,例如汉堡菜单、Snackbars或面包屑。面包屑或面包屑路径是一种导航元素,可帮助用户了解他们在网站上的当前位置。 1. 定义: 它们代表链接的水平列表,其中最后一个表示当前位置,其余定义其“祖先”(父页面、祖父页面等)。面包屑

    2024年02月06日
    浏览(29)
  • vue修改element面包屑样式

    element面包屑默认后边的是浅颜色的,前边的是深色的, 现在UI设计图要修改成前面是浅色的,后面是深色的 如果直接修改样式会无法区分一级或者二级路由,用一下方法可以实现: 这样就会给一级路由加上了first_route类名,给二级路由加上了two_route的类名,然后定义样式:

    2024年01月25日
    浏览(33)
  • ElementUI浅尝辄止29:Breadcrumb 面包屑

    显示当前页面的路径,快速返回之前的任意页面。 在 el-breadcrumb 中使用 el-breadcrumb-item 标签表示从首页开始的每一级。Element 提供了一个 separator 属性,在 el-breadcrumb 标签中设置它来决定分隔符,它只能是字符串,默认为斜杠 / 。 通过设置  separator-class  可使用相应的  icon

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包