位置: IT常识 - 正文

vue-router + element-plus实现面包屑导航栏和路由标签栏

编辑:rootadmin
vue-router + element-plus实现面包屑导航栏和路由标签栏 效果预览

推荐整理分享vue-router + element-plus实现面包屑导航栏和路由标签栏,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

首先,先解释一下什么是面包屑导航栏和路由标签栏。

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

在这里解释一下,我所说的父辈路由是父路由的超集,对于一个子路由,它的父路由、它的父路由的父路由、它的父路由的父路由的父路由…都属于它的父辈路由。我也不知道这种叫法是否规范,反正大家理解这个意思就行。

然后展示一下效果: 这是我自己做的一个基于vue3+typescript的网站,后端是用golang写的,网站有查询微博、百度、凤凰历史热搜的功能,以及上传图片、创建相册、分享相册等云图床相关功能。这是网站预览地址和gitee仓库地址。(ps:此网站并不是一个demo,而是具有完整前后端交互和一定功能的网站,需要注册并登陆才能使用,注册很简单,只需要设置用户名、账号、密码即可。**也可登陆测试账号: admin,密码: 123456。**但如果有两人同时登陆这个测试账号,那么后者会把前者挤下去,当然这种概率很小罢了。)

对于侧边导航栏如何实现的,请移步这篇文章:vue-router + element-plus实现多层级路由的动态展示

在本文章中,我主要讲解如何实现面包屑导航栏和路由标签栏。

面包屑导航栏的实现

先讲一下大体思路:

首先弄清楚面包屑导航栏要展示哪些数据然后想办法获取这些数据最后把数据应用到组件中

首先,面包屑展示哪些数据?

路由的结构其实就是一棵树,没有子路由的路由对应树中的一个叶子节点,面包屑导航栏中要展示的就是这个当前页面对应的子路由、以及该子路由所有的父辈路由。

为了方便说明,我举个例子,现在有一个网页的路由结构如下图中所示,假如当前我们处于localhost:8080/earth/asia/china页面,那么当前页面的子路由就是中国,它有两个父辈路由分别是亚洲和地球,所以我们要在面包屑中展示的信息就是 “地球 / 亚洲 / 中国” 然后,如何获取这些数据?

在一棵树中,要获得一个叶子节点的所有父辈节点信息,可以从根节点开始进行dfs深度优先搜索,在搜索的过程中存一下在当前分支上搜过的路径,如果遇到叶子节点就把路径保存起来作为结果。

vue-router + element-plus实现面包屑导航栏和路由标签栏

这种方法是一种可行方案,但其实还有更简单的方法。我们可以把这棵树线索化,在每个节点中存一下父节点的信息,那么就可以根据该节点直接获得父节点,进而获得父节点的父节点,父节点的父节点的父节点…,递归操作,就可以该节点获得所有父辈节点信息。

下面是从我的网站源码/src/router/index.ts中截取出来的代码,可以看到我在meta里自定义了一个parentRouteName属性,这个属性就是线索属性,我们可以借助这个属性获取该路由的父路由。

{path: 'weibo',name: 'Weibo',component: () => import('../views/hot/Weibo.vue'),meta: {description: '微博热搜查询',parentRouteName: "Hot",showInAside: true,showInHeader: true}},

下面这个函数的作用是获取某个路由的所有父辈路由信息,参数name是子路由的名称,参数routes是路由数组,返回值是一个string数组,它的值是 […, 爷爷路由名称, 父亲路由名称, 子路由名称]。

依然沿用上面的例子,假如我们传入的name属性等于’china’,那么函数的返回值是[‘earth’, ‘asia’, ‘china’]

// 获取面包屑的路由名称数组export function getNames(name: string, routes:RouteRecordNormalized[]): string[]{ let names: string[] = [] // 使用while循环进行递归操作,直至遍历到最顶级的父辈路由,然后退出循环 while(true){ names.push(name) let route = getRouteByName(name, routes) as RouteRecordNormalized let parentRoute = getRouteByName(route.meta?.parentRouteName as string, routes) if(parentRoute){ name = parentRoute.name as string continue } else{ break } } return names.reverse()}

最后,将数据写入element-plus提供的面包屑组件

获取了数据之后,接下来要做的就很简单了,只需要把数据写到面包屑组件里做展示即可,如下面代码所示。

还需要添加一个路由守卫,在每次路由跳转后都要更新面包屑里的数据。其实可以写成计算属性的,毕竟route对象和router对象都是响应式的。

下面的代码是从源码/src/components/layout/Header.vue里截出来的,想看完整的代码请访问gitee仓库地址。

<template><el-breadcrumb separator="/"> <el-breadcrumb-item v-for="description,index in descriptions" :key="description" :to="{ name: routeNames[index] }" class="breadcrumb-item" > {{description}} </el-breadcrumb-item></el-breadcrumb></template><script setup lang="ts">import { getNames, getDescriptions, getRouteByName } from '../../util/handleRoutes'import {useRouter, useRoute, RouteRecordNormalized} from 'vue-router'const router = useRouter()const route = useRoute()let descriptions = ref<string[]>([])let routeNames = ref<string[]>([])//获取面包屑的数据routeNames.value = getNames(route.name as string, router.getRoutes()) descriptions.value = getDescriptions(routeNames.value, router.getRoutes())//在每次路由跳转后,更新面包屑的数据router.afterEach((to, from) => { //不知道为什么,进入页面时,会有两次路由跳转,route.name为空 if(!route.name){ console.log(route.name, route.meta) return } routeNames.value = getNames(route.name as string, router.getRoutes()) descriptions.value = getDescriptions(routeNames.value, router.getRoutes())})</script>路由标签栏的实现

和上面的思路类似,要实现路由标签栏,我们也是分三个步骤:

首先,考虑路由标签栏需要哪些数据然后,如何获取这些数据最后,如何把这些应用到组件并展示出来

首先,路由标签栏需要哪些数据?

类比一下,浏览器标签栏存放的是曾经访问过的网页,那么很显然路由标签栏需要的数据就是曾经访问过的路由页面。

然后,如何获取访问过的路由页面?

我是这样做的,在pinia里定义一个routerStore,里面有个visitedRoutes属性,用来存放所有访问过的路由,它的初始值只包含首页对应的路由。

import { defineStore } from "pinia"import { RouteRecordNormalized} from "vue-router"import { router } from "../router"import { getRouteByName } from "../util/handleRoutes"let defaultRoute = getRouteByName('Home', router.getRoutes()) as RouteRecordNormalizedlet visitedRoutes = [defaultRoute]export const useRouteStore = defineStore('route', { // 推荐使用 完整类型推断的箭头函数 state: () => { return { visitedRoutes } },})

添加一个路由守卫,在每次路由跳转后,如果进的路由不存在于visitedRoutes,那么把这个路由添加到visitedRoutes里面。

router.afterEach((to, from) => { if(!to.meta.showInHeader){ return } let result = routeStore.visitedRoutes.find(val => val.name == to.name) if(!result){ routeStore.visitedRoutes.push(getRouteByName(to.name as string, router.getRoutes()) as RouteRecordNormalized) }})

最后,把历史访问数据应用到组件里

这一步比面包屑的最后一步要复杂一些,因为路由标签的交互比较多,当路由标签被点击时,需要跳转到相应路由。当路由标签被关闭时,如果当前页面并不是要关闭的路由标签,那么直接关闭即可;如果当前页面时要关闭的路由标签,那么需要进行路由跳转,跳转到首页。 下面的代码是从源码/src/components/layout/Header.vue里截出来的,想看完整的代码请访问gitee仓库地址。

<template> <div class="header-part-two"> <el-tag v-for="visitedRoute in routeStore.visitedRoutes" :key="visitedRoute.name" :closable="visitedRoute.name != 'Home'" :disable-transitions="false" @close="handleClose(visitedRoute.name as string)" @click="goToRoute(visitedRoute.name as string)" @click.middle="handleClose(visitedRoute.name as string)" :class="{'active-tag': isActive(visitedRoute.name as string)}" > {{ visitedRoute.meta?.description }} </el-tag> </div></template><script>import {useRouter, useRoute, RouteRecordNormalized} from 'vue-router'import { useRouteStore } from '../../store/route'const routeStore = useRouteStore()const router = useRouter()const route = useRoute()// 跳转function goToRoute(name:string){ router.push({name})}function isActive(name:string){ return name == route.name }// 关闭function handleClose(routeName: string){ if (routeName === 'Home') { return } routeStore.visitedRoutes = routeStore.visitedRoutes.filter(val => val.name != routeName) if(route.name == routeName){ router.push('/') }}</script>
本文链接地址:https://www.jiuchutong.com/zhishi/300155.html 转载请保留说明!

上一篇:【MySQL】表的数据处理(mysql表中数据)

下一篇:用Pytorch搭建一个房价预测模型(pytorch创建模型)

  • 腾讯vip设置几个人用(腾讯视频会员可以几个人用怎么设置)

    腾讯vip设置几个人用(腾讯视频会员可以几个人用怎么设置)

  • 抖音手机号换了收不到验证码怎么办(抖音手机号换了怎么找回以前的抖音号)

    抖音手机号换了收不到验证码怎么办(抖音手机号换了怎么找回以前的抖音号)

  • 小米8烧屏怎么恢复(小米烧屏怎么办)

    小米8烧屏怎么恢复(小米烧屏怎么办)

  • 支持内存卡的手机(支持内存卡的手机2022)

    支持内存卡的手机(支持内存卡的手机2022)

  • 怎么找别人的抖音橱窗(怎么找别人的抖音号)

    怎么找别人的抖音橱窗(怎么找别人的抖音号)

  • 小爱同学语音唤醒不了(小爱同学语音唤醒功能怎么设置)

    小爱同学语音唤醒不了(小爱同学语音唤醒功能怎么设置)

  • 淘宝直播不退不换规则(淘宝直播不退不换规则没发货可以退款吗)

    淘宝直播不退不换规则(淘宝直播不退不换规则没发货可以退款吗)

  • adobe打开pdf闪退(pdf点开后闪退怎么回事)

    adobe打开pdf闪退(pdf点开后闪退怎么回事)

  • airpods2序列号在哪里(airpods2序列号在充电仓右边)

    airpods2序列号在哪里(airpods2序列号在充电仓右边)

  • 快手ld是什么意思(快手id是啥意思)

    快手ld是什么意思(快手id是啥意思)

  • wps夜间模式在哪里切换(wpsoffice夜间模式在哪)

    wps夜间模式在哪里切换(wpsoffice夜间模式在哪)

  • 内存储器的容量是指(内存储器的容量是由________总线的宽度确定的)

    内存储器的容量是指(内存储器的容量是由________总线的宽度确定的)

  • 一个宽带能接几个电视(一个宽带能接几台电视机)

    一个宽带能接几个电视(一个宽带能接几台电视机)

  • 手机卸载的软件怎么恢复(手机卸载的软件怎么彻底清除)

    手机卸载的软件怎么恢复(手机卸载的软件怎么彻底清除)

  • 英文版微信怎么转文字(英文版微信怎么艾特所有人)

    英文版微信怎么转文字(英文版微信怎么艾特所有人)

  • 微信设备管理有好几个(微信设备管理有不认识的设备)

    微信设备管理有好几个(微信设备管理有不认识的设备)

  • ie如何去谷歌广告(谷歌的ie在哪里设置)

    ie如何去谷歌广告(谷歌的ie在哪里设置)

  • 华为手机总有提示音怎么回事(华为手机总有提示音 而且还看不到)

    华为手机总有提示音怎么回事(华为手机总有提示音 而且还看不到)

  • ios12清理垃圾(苹果12手机清理垃圾)

    ios12清理垃圾(苹果12手机清理垃圾)

  • 信用卡pos机怎么用(信用卡pos机怎么改银行卡)

    信用卡pos机怎么用(信用卡pos机怎么改银行卡)

  • 触宝电话怎么设置来电秀(触宝电话怎么设密码)

    触宝电话怎么设置来电秀(触宝电话怎么设密码)

  • soul查看访客记录(soul访客)

    soul查看访客记录(soul访客)

  • 华为p30快充设置(华为p30如何设置快充模式)

    华为p30快充设置(华为p30如何设置快充模式)

  • 华为nova5pro怎么设置时间(华为nova5pro怎么截屏)

    华为nova5pro怎么设置时间(华为nova5pro怎么截屏)

  • 手机怎么修改图片像素(手机怎么修改图片的kb大小)

    手机怎么修改图片像素(手机怎么修改图片的kb大小)

  • 电脑自带的word在哪里(电脑自带的word用不了怎么办)

    电脑自带的word在哪里(电脑自带的word用不了怎么办)

  • python可以写PPT吗(python可以制作软件吗)

    python可以写PPT吗(python可以制作软件吗)

  • 所得税汇算资产总额怎么算
  • 固定资产折旧会计处理
  • 公司办理税务注销的相关规定
  • 买房子一定要交税吗
  • 租地建厂房房产税谁交
  • 关联交易金额是付款还是入账
  • 小规模纳税人超500万后何时认定为一般纳税人
  • 人力资源服务费发票可以抵扣吗
  • 研发支出的材料费
  • 出口免税进项税额转出会计分录
  • 跨月的普通发票怎么开
  • 物业公司需要向哪个部门缴费
  • 按月预提短期借款利息
  • 企业所得税根据什么报表申报
  • 简易征收税率都包括什么
  • 通用机打发票上面为什么不体现税率
  • 招待费怎么处理
  • 汽修厂的财务怎样做账
  • 企业所得税退税会计分录
  • 经营性租入的设备是资产吗
  • 样品开发费用怎么记账
  • 建筑企业存款账户
  • 公司收到残联补助如何开票
  • 利润分配补亏
  • 汇算清缴所得税退回做账
  • win7ie图标删除了怎么恢复
  • 扣扣斗图在哪里设置
  • php快速查找
  • 跨年冲减无发票怎么入账
  • 摊销租赁费属于什么费用
  • 八个与cpu相关的字符
  • 融资性租赁的优缺点
  • 预提土增税账务处理
  • 延期支付土地款利息会计处理
  • php取二维数组的一组内容
  • 贷款的减值会计怎么做账
  • 企业研发费用加计扣除是什么意思
  • 未分配利润可以弥补亏损吗
  • Yii CDBCriteria常用方法实例小结
  • php识别验证码的库高级
  • php fopen函数的用法
  • 银行手续费发票未到怎样做账
  • 个体定额和不定额有什么区别
  • 两者有什么区别用英语怎么说
  • 符合规定的国内旅客运输发票可以作为扣税凭证吗
  • 境外服务费代扣代缴所得税怎么做账
  • 进口货物的完税价格计算公式
  • 多计提的个人所得税退给员工怎么处理
  • 支付销售商品运费
  • 会计中制造费用包括哪些内容
  • 出口退税分类管理三类企业
  • 公司贷款手续如何办理流程
  • 2021劳动报酬收入个人所得税怎么算
  • 股份有限公司股东人数
  • 营改增后如何纳税
  • 开业费用是什么意思
  • 成本分配表是实际成本吗
  • 减少注册资本要公示多少天
  • 关于mysql中的字符型数据下面说法正确的是
  • mysql 分组语句
  • watchdog. sys
  • windows有哪些好用的软件
  • ubuntu安装office2019
  • win7系统账户名怎么看
  • win10如何将我的电脑添加到桌面
  • jquery添加css样式
  • cssid和class的区别
  • 批处理命令不允许用户在文件夹内的文件
  • wc -l命令
  • mono为什么不能用了
  • 三个文件怎么汇总到一个里
  • vue中使用jsx
  • python生成txt文档
  • java语言基于对象
  • androidday3
  • 出口退税收入怎么做账
  • 税务稽查为什么不问证人
  • 一级稽查体制
  • 准生证网上查询码是个什么
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设