个人博客——实现路由标签栏(前端)

需求:

  • 打开的页面标签显示在标签栏中
  • 点击标签栏跳转到对应页面
  • 关闭标签栏的是当前打开的页面,则关闭当前页面,打开最后一个标签栏对应页面;如果关闭的标签栏不是打开页面,则直接关掉该标签栏

思路:

  • 用pinia记录打开的路由列表
  • 用el-tag根据pinia中记录的路由列表渲染标签栏
  • 设置路由守卫,判断跳转的页面路由是否已经记录在pinia中,如果没记录,则进行添加;如果有则不进行操作
  • 关闭标签栏则将该路由从pinia中删除

实现

  1. 在pinia中记录访问过的路由,和默认打开的页面路由
    //路由标签页
    let activeRoute = {
      path: '/BackendHome',
      name: '首页',
    };
    let visitedRoutes=reactive([activeRoute]) ;
  1. 因为只有后台相关的路由才需要存入visitedRoutes,所以给相关路由的meta添加属性record,用于判断是否该路由是否需要存入visitedRoutes
    在这里插入图片描述

  2. 添加路由守卫,判断跳转的路由是否需要存入visitedRoutes中,且visitedRoutes是否已经存在该路由,如果不存在则加入visitedRoutes中,已经存在则返回

router.afterEach((to)=>{
  if(to.meta.record){   
    const userMsg = userStore();
    let routerHas = userMsg.visitedRoutes.findIndex((val)=>{
     return val.name ===  to.name
  })
    if(routerHas == -1){
      userMsg.visitedRoutes.push({path:to.path,name:to.name});
    }else{
      return
    }

  }else{
    return
  }

})
  1. 将标签栏封装为组件,存放在 src\components\backComponents\Tags.vue,写入下面代码。
    读取visitedRoutes中的数据用于渲染tag。打开新的页面则标签页增加;点击标签页则跳转到相应页面;关闭标签页,则删除visitedRoutes中对应路由,并判断关闭的标签页是否是当前活跃的页面,如果是则关闭当前页面,并打开visitedRoutes最后一个页面。
<template>
    <div class="tags">
       <el-tag v-for="item in userMsg.visitedRoutes"
       :key="item.name"
       :closable="item.name != '首页'"
       type="warning"
       :disable-transitions="false"
       @close="closeTag(item.name)"
       @click="goToRoute(item.path)"
       >
       {{ item.name }}
       </el-tag>
    </div>
</template>

<script setup lang="ts">
import {useRouter, useRoute} from 'vue-router'
import {userStore} from '../../stores'

const userMsg = userStore();
//全局路由
const router = useRouter();
//当前活跃的路由
const route = useRoute();

//关闭标签页
const closeTag = (name:string)=>{
  console.log('关闭',name);
  if(name == '首页'){
    return
  }else{
    userMsg.deleteTAb(name);
    if(route.name == name){
       let routeLength = userMsg.visitedRoutes.length;
        if(userMsg.visitedRoutes && routeLength >= 1 ){
            router.push(userMsg.visitedRoutes[routeLength-1]);
        }
    }
    
  }
}

//点击标签页
const goToRoute = (path:string)=>{
    router.push(path);
}

</script>

<style scoped>

</style>

在pinia中添加相应删除标签页方法

    //删除标签页
    const deleteTAb = (tabName:string)=>{
      //获取要删除的路由下标
      let tabIndex = visitedRoutes.findIndex((val)=>{
         return val.name ==  tabName
      })
      if(tabIndex != -1){
        visitedRoutes.splice(tabIndex,1);
      }
    }
  1. 最后引入组件
    最终效果如下
    在这里插入图片描述

参考文章1
参考文章2

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue3中,可以使用动态路由标签实现管理后台的需求。首先,你需要设置路由,并配置相关的菜单和导航。基于Router的配置,可以添加title、icon等菜单所需的属性。可以使用baseUrl来设置基础URL,用于发布到非根目录的情况。可以设置home来指定默认显示的组件。menus用于定义路由和菜单集合。naviId和menuId用于指定导航ID和路由的名称。path用于指定路由的路径。title用于设置浏览器的标题。icon用于菜单的图标。childrens用于定义子菜单。 对于管理后台,一个必要的需求是根据用户的权限来加载路由和菜单。这可以通过动态加载路由和菜单来实现。根据用户的权限,你可以动态生成路由和菜单,并将其添加到已有的路由配置和菜单集合中。 除了菜单和路由,你可能还需要实现一个动态多tab的功能。为了满足不同的需求,你可以封装两个组件:一个单tab的组件和一个动态多tabs的组件。单tab组件可以参考Router的router-view组件进行封装,使用动态组件来加载具体的内容。 最后,你还可以加上权限判断来限制用户访问某些路由和菜单。根据用户的权限,你可以在加载路由和菜单时进行判断,只显示用户有权限访问的内容。这可以通过在路由配置和菜单集合中添加权限字段,并在加载时进行判断来实现。 综上所述,你可以通过设置路由、配置菜单、使用动态tab和加上权限判断来实现Vue3中的路由标签。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值