elementui实现标签页与菜单栏联动

技术:vue2+vuex+elementui
在这里插入图片描述
store/index.js文件里

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    tabList:[]
  },
  mutations: {
    addTab: (state, tab) => {
      // 如果tab已经存在,不添加新的tabs
      if (state.tabList.some(item => item.path === tab.path)) return
      state.tabList.push(tab)
    }
  },
  getters: {
    // 获取tbsList
    getTabs: (state) => {
      return state.tabList
    }
  },
  actions: {
  },
  modules: {
  }
})

功能点:
1:当前活跃的tab就是当前路由的path
2: 页面刷新,tabList数据丢失,则在刷新之前使用sessionStorage进行存储
3:删除tab的时候,活跃的tab变为被删除的前一个或者下一个,删除后重新设置活跃的tab 和tabList
4:监控路由变化,路由变化了,活跃的tab 和tabList 也要随之变化

<template>
  <el-tabs
    v-model="activeTab"
    closable
    @tab-remove="removeTab"
    @tab-click="clickBtn"
  >
    <el-tab-pane
      :key="index"
      v-for="(item, index) in tabList"
      :label="item.title"
      :name="item.path"
    >
      {{ item.content }}
    </el-tab-pane>
  </el-tabs>
</template>

<script>
import store from '../../store'
export default {
  name: '',
  data() {
    return {
      // 当前活跃的tabs
      activeTab: '',
    }
  },
  components: {},
  computed: {
    tabList() {
      return store.getters['getTabs']
    },
  },
  watch: {
    $route: function () {
      this.setActiveTab()
      this.addTab()
    },
  },
  created() {},
  mounted() {
    this.beforeRefresh()
    this.setActiveTab()
    this.addTab()
  },
  methods: {
    // 设置活跃的tab
    setActiveTab() {
      this.activeTab = this.$route.path
    },
    // 添加tab
    addTab() {
      const { path, meta } = this.$route
      const tab = {
        path,
        title: meta.title,
      }
      store.commit('addTab', tab)
    },
    // 点击tab
    clickBtn(tab) {
      const { name } = tab
      this.$router.push({ path: name })
    },
    // 删除tab
    removeTab(target) {
      // 当前激活的tab
      let active = this.activeTab
      const tabs = this.tabList
      // 只有一个标签页的时候不允许删除
      if (tabs.length === 1) return
      if (active === target) {
        tabs.forEach((tab, index) => {
          // 如果删除的就是当前活跃的tab,就把活跃的tab变成上一个或下一个
          const nextTab = tab[index + 1] || tab[index - 1]
          if (nextTab) {
            active = nextTab.path
          }
        })
      }
      // 重新设置当前激活的选项卡和 选项卡列表
      this.activeTab = active
      store.state.tabList = tabs.filter((tab) => tab.path !== target)
    },
    // 解决刷新数据丢失问题
    beforeRefresh() {
      window.addEventListener('beforeunload', () => {
        sessionStorage.setItem('tabsView', JSON.stringify(this.tabList))
      })
      let tabSession = sessionStorage.getItem('tabsView')
      if (tabSession) {
        let oldTabs = JSON.parse(tabSession)
        if (oldTabs.length > 0) {
          store.state.tabList = oldTabs
        }
      }
    },
  },
}
</script>




补充:路由

{
    path: '/layout',
    component: () => import('../layout/index.vue'),
    children: [
      {
        path: 'lay1',
        component: () => import('../views/lay/Lay1.vue'),
        meta: {
          title:'选项1'
        }
      },
      {
        path: 'lay2',
        component: () => import('../views/lay/Lay2.vue'),
        meta: {
          title:'选项2'
        }
        
      },
      {
        path: 'lay3',
        component: () => import('../views/lay/Lay3.vue'),
        meta: {
          title:'选项3'
        }
      },
      {
        path: 'lay4',
        component: () => import('../views/lay/Lay4.vue'),
        meta: {
          title:'选项4'
        }
      },
    }
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Vue 3和Element Plus提供了一种简单的方法来实现侧边菜单栏标签之间的联动。下面是一个基本示例,演示了如何实现这一功能: 1. 首先,确保你已经安装了Vue 3和Element Plus,并在项目中引入它们。 2. 创建一个侧边菜单栏组件(SideMenu),用于展示菜单项。这个组件可以使用Element Plus的Menu组件来创建。 ```html <template> <el-menu :default-active="activeMenu" @select="handleMenuSelect"> <el-menu-item v-for="item in menuItems" :key="item.path" :index="item.path"> {{ item.name }} </el-menu-item> </el-menu> </template> <script> export default { data() { return { activeMenu: '', // 当前选中的菜单项 menuItems: [ { name: '菜单1', path: '/menu1' }, { name: '菜单2', path: '/menu2' }, // 其他菜单项... ] } }, methods: { handleMenuSelect(index) { this.activeMenu = index; // 更新选中的菜单项 this.$router.push(index); // 导航到对应的路由 } } } </script> ``` 3. 创建一个标签组件(Tabs),用于展示已打开的面。这个组件可以使用Element Plus的Tabs组件来创建。 ```html <template> <el-tabs v-model="activeTab" type="border-card" @tab-remove="handleTabRemove"> <el-tab-pane v-for="tab in openedTabs" :key="tab.path" :label="tab.name" :name="tab.path"> <!-- 面内容 --> </el-tab-pane> </el-tabs> </template> <script> export default { data() { return { activeTab: '', // 当前选中的标签 openedTabs: [] // 已打开的标签 } }, methods: { addTab(tab) { const index = this.openedTabs.findIndex(item => item.path === tab.path); if (index === -1) { this.openedTabs.push(tab); } this.activeTab = tab.path; // 选中新打开的标签 }, removeTab(targetName) { const index = this.openedTabs.findIndex(item => item.path === targetName); if (index !== -1) { this.openedTabs.splice(index, 1); } }, handleTabRemove(targetName) { this.removeTab(targetName); if (targetName === this.activeTab) { this.activeTab = this.openedTabs[this.openedTabs.length - 1].path; } } } } </script> ``` 4. 在你的主面中,使用以上两个组件来实现联动效果。 ```html <template> <div> <side-menu></side-menu> <tabs></tabs> </div> </template> <script> import SideMenu from './SideMenu.vue'; import Tabs from './Tabs.vue'; export default { components: { SideMenu, Tabs } } </script> ``` 在这个例子中,当你点击侧边菜单栏的菜单项时,会更新选中的菜单项,并导航到对应的路由。同时,会在标签中打开一个新的标签。如果你点击已打开的标签的关闭按钮,会关闭该标签并自动选中最后一个打开的标签。 这样就实现了侧边菜单栏标签联动效果。你可以根据自己的需求进行定制和扩展。希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值