vue 使用element 菜单与tab页联动

 

<template>
  <div class="ucen-menubar menu">
    <div class="sider">
      <el-menu class="el-menu-vertical-demo siderBar" background-color="#2A2E3C" text-color="#fff">
        <el-submenu :index="''+index" v-for="(item,index) in menus" :key="index" :class="item.class">
          <template slot="title">
            <span class="titleIcon"></span>
            <span>{{item.menuName}}</span>
          </template>
            <el-menu-item :index="index+'-'+num" v-for="(data,num) in item.data" :key="num"  @click="addTab(data)">
              <span :class="data.class"></span>
              <span slot="title">{{data.name}}</span>
            </el-menu-item>
        </el-submenu>
      </el-menu>
    </div>
    <div class="content">
      <el-tabs v-model="TabsValue" type="card" closable @tab-remove="removeTab">
        <el-tab-pane v-for="(item, index) in Tabs" :key="item.name" :label="item.title" :name="item.name">
          <tab-component :is="item.content" :name="item.name"></tab-component>
        </el-tab-pane>
      </el-tabs>
    </div>
  </div>
</template>
<script>
import Vue from "vue";
import Bus from "@/assets/js/vendor/bus.js";
export default {
  name: "UcenMenubar",
  props: ["gradfrom", "menus"],
  components: { appMenu },
  data() {
    return {
      show: false,
      TabsValue: "",
      value: "",
      input: "",
      Tabs: []
    };
  },
  created() {
    let that = this;
    Bus.$on("openNewTab", function(name) {
      that.openTab(name);
    }),
      Bus.$on("NewTab", function(name) {
        that.openTab(name);
      });
    Bus.$on("NewManyTab", function(name) {
      that.openTabMany(name);//链接打开多个页面
    });
  },
  beforeDestroy() {
    Bus.$off("openNewTab", name);
    Bus.$off("NewTab", name);
    Bus.$off("NewManyTab", name);
  },
  methods: {
    // 打开多个页面
    openTabMany(name) {
      for (var m = 0; m < this.menus.length; m++) {
        for (var n = 0; n < this.menus[m].data.length; n++) {
          var ser = this.menus[m].data;
          if (ser[n].name == name.name) {
            this.addTabMany(ser[n], name.tabname);
          }
        }
      }
    },
    addTabMany(menu, tabname) {
      var exist = false;
      for (var i = 0; i < this.Tabs.length; i++) {
        if (tabname == this.Tabs[i].title) {
          exist = true;
          break;
        }
      }
      if (exist == true) {
        this.TabsValue = tabname;
        return;
      }
      this.Tabs.push({
        title: tabname,
        name: tabname,
        showItem: menu.showItem,
        content: menu.component
      });
      this.TabsValue = tabname;
    },
    // 跳转页面
    openTab(name) {
      for (var m = 0; m < this.menus.length; m++) {
        for (var n = 0; n < this.menus[m].data.length; n++) {
          var ser = this.menus[m].data;
          if (ser[n].name == name) {
            this.addTab(ser[n]);
          }
        }
      }
    },
    // 菜单打开页面
    addTab(menu) {
      var exist = false;
      for (var i = 0; i < this.Tabs.length; i++) {
        if (menu.name == this.Tabs[i].name) {
          exist = true;
          break;
        }
      }
      if (exist == true) {
        this.TabsValue = menu.name;
        return;
      }
      this.Tabs.push({
        title: menu.name,
        name: menu.name,
        showItem: menu.showItem,
        content: menu.component
      });
      this.TabsValue = menu.name;
    },
    //remove
    removeTab(targetName) {
      let tabs = this.Tabs;
      let activeName = this.TabsValue;
      if (activeName === targetName) {
        tabs.forEach((tab, index) => {
          if (tab.name === targetName) {
            let nextTab = tabs[index + 1] || tabs[index - 1];
            if (nextTab) {
              activeName = nextTab.name;
            }
          }
        });
      }

      this.TabsValue = activeName;
      this.Tabs = tabs.filter(tab => tab.name !== targetName);
    }
  }
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->

 

 
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
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> ``` 在这个例子中,当你点击侧边菜单栏的菜单项时,会更新选中的菜单项,并导航到对应的路由。同时,会在标签中打开一个新的标签。如果你点击已打开的标签的关闭按钮,会关闭该标签并自动选中最后一个打开的标签。 这样就实现了侧边菜单栏与标签联动效果。你可以根据自己的需求进行定制和扩展。希望对你有所帮助!
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值