人力资源中台动态路由tab栏效果

1.效果图

2.技术栈

借助elementUI组件库的tabs组件,结合路由对象,实现点击导航栏,增加tab栏,同时tab栏可删除的效果。

3.实现思路

  1. 封装tabs栏组件
<el-tabs
    v-model="activeTabName"
    type="card"
    :closable="tabsTitle.length !== 1"
    @tab-remove="removeTab"
    @tab-click="tabClick"
  >
    <el-tab-pane
      v-for="item in tabsTitle"
      :key="item.name"
      :label="item.title"
      :name="item.name"
    />
  </el-tabs>
  1. 计算属性获取所有路由信息
computed: {
    routes() {
      return this.$router.options.routes.filter(value => !value.hidden) // 获取所有的路由信息,并过滤掉不需要显示的路由(带有hidden属性)
    }
  },
  1. 侦听器监听$route的变化,增加tab栏并去重
watch: {
     $route: {
      async handler(to, from) {
        // 获取当前要去向的路由对象
        let obj = {}
        this.routes.forEach(item => {
          if (item.path === to.path || item.redirect === to.path) {
            obj = item
          } else if (item.children && item.children.length > 0) {
            item.children.forEach(value => {
              if (value.name === to.name) {
                obj = value
              }
            })
          }
        })
        this.tabsTitle.push({
          title: (obj.meta && obj.meta.title) || obj.children[0].meta.title,
          name: to.path
        }) // 将当前路由对象中的path和meta.title以对象形式保存到tabsTitle中,供后续使用
        this.activeTabName = to.path // 设置当前高亮tab栏
        const strings = this.tabsTitle.map(item => JSON.stringify(item))
        const removeDulpList = Array.from(new Set(strings))
        this.tabsTitle = removeDulpList.map(item => JSON.parse(item)) // 上述操作对tabsTitle数组进行深度去重
      },
      deep: true, // 深度监听
      immediate: true // 实时监听
    }
  },
  1. 删除tab栏功能
removeTab(removeName) {
      const index = this.tabsTitle.findIndex(item => item.name === removeName) // 获取index
      this.tabsTitle.splice(index, 1) // 删除点击tab移出按钮的tab栏
      if (removeName === this.activeTabName) {
        // 删除的tab栏是当前高亮的tab栏的情况
        if (index === 0) {
          // 如果的点击tab移出按钮的tab栏索引为0,则设置第0项tab栏为高亮
          this.activeTabName = this.tabsTitle[index].name
        } else {
          // 设置index - 1项为高亮
          this.activeTabName = this.tabsTitle[index - 1].name
        }
        // 跳转到高亮的tab栏
        this.$router.push(this.activeTabName)
      }
    }
  1. 点击tab栏切换页面
tabClick(tab) {
      this.$router.push(tab.name)
    }
  1. 使用组件
<template>
  <section class="app-main">
    <tabs />
    <transition name="fade-transform" mode="out-in">
      <keep-alive>
        <router-view :key="key" />
      </keep-alive>
    </transition>
  </section>
</template>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值