1. 今天的一个需求是在后台框架的基础上添加tab页,结果页面如下

  2. 原本上述红框内的内容是不存在的,直接点击左侧菜单栏进行页面跳转,现加了tab标签栏,实现快速的跳转

  1. 具体要根据自己的route实现类进行筛选,核心vue如下
  1. <template>
  2. <div>
  3. <el-tabs v-model="TabsValue" type="card" closable @tab-remove="removeTab">
  4. <el-tab-pane style="border-radius: 3px" v-for="(item, index) in Tabs" :key="item.name" :label="item.title" :name="item.name">
  5. <tab-component style="border-radius: 3px;margin: -15px 10px 0px 10px;" :index="index" :name="index"></tab-component>
  6. </el-tab-pane>
  7. </el-tabs>
  8. </div>
  9. </template>
  10. <script>
  11. import Vue from \'vue\'
  12. export default {
  13. name: \'TabBar\',
  14. data(){
  15. return {
  16. uniqueOpened: true,
  17. TabsValue: \'\',
  18. Tabs: [],
  19. index:0,
  20. tabComponent:{}
  21. }
  22. },
  23. methods: {
  24. addOneTab(menu) {
  25. var exist = false;
  26. for (var i = 0; i < this.Tabs.length; i++) {
  27. if (menu.name === this.Tabs[i].name) {
  28. exist = true;
  29. break
  30. }
  31. }
  32. if (exist === true) {
  33. this.TabsValue = menu.name;
  34. return
  35. }
  36. this.Tabs.push({
  37. title: menu.name,
  38. name: menu.name,
  39. content: menu.component
  40. });
  41. var _this = this;
  42. this.tabComponent = Vue.component(\'tab-component\', {
  43. render: function (h) {
  44. var comp = _this.Tabs[this.index].content;
  45. return h(comp)
  46. },
  47. props: {
  48. index: {
  49. type: Number,
  50. required: true
  51. }
  52. }
  53. });
  54. this.TabsValue = menu.name
  55. },
  56. addTab(e) {
  57. let first = "/"+e.split("/")[1];
  58. let two = e.split("/")[2];
  59. let tempRoutes = this.$router.options.routes;
  60. for (let i = 0; i < tempRoutes.length; i++) {
  61. let temp = tempRoutes[i];
  62. if (temp.path === first) {
  63. for (let j = 0; j < temp.children.length; j++) {
  64. let child = temp.children[j];
  65. if (child.path === two) {
  66. let menu = {};
  67. menu.name = child.meta.title;
  68. menu.component = child.component;
  69. this.addOneTab(menu);
  70. }
  71. }
  72. }
  73. }
  74. },
  75. removeTab(targetName) {
  76. let tabs = this.Tabs;
  77. let activeName = this.TabsValue;
  78. if (activeName === targetName) {
  79. tabs.forEach((tab, index) => {
  80. if (tab.name === targetName) {
  81. let nextTab = tabs[index + 1] || tabs[index - 1];
  82. if (nextTab) {
  83. activeName = nextTab.name;
  84. }
  85. }
  86. });
  87. }
  88. this.TabsValue = activeName;
  89. this.Tabs = tabs.filter(tab => tab.name !== targetName);
  90. }
  91. }
  92. }
  93. </script>
  1. 上述是tab的实现,再就是菜单选择调用tab的addTab方法
  1. <el-menu @select="addTab" mode="vertical" unique-opened :default-active="$route.path" :collapse="isCollapse"
  2. background-color="#304156" text-color="#fff" active-text-color="#409EFF">
  3. <sidebar-item :routes="routes"></sidebar-item>
  4. </el-menu>
  5. addTab(e) {
  6. this.$refs.tabBar.addTab(e);
  7. }
  1. 上面代码会看着有点奇怪,因为SideBar,也就是上述的el-menu所在组件和tab是平级的,如下
  1. <template>
  2. <div class="app-wrapper" :class="{hideSidebar:!sidebar.opened}">
  3. <sidebar ref="sidebar" @addTab="addTab" class="sidebar-container"></sidebar>
  4. <div class="main-container">
  5. <navbar></navbar>
  6. <tab-bar ref="tabBar"></tab-bar>
  7. <app-main></app-main>
  8. </div>
  9. </div>
  10. </template>

siderBartab-bar在同一个组件内,所以要实现参数传递,需要先emit提交事件,再在父组件传递给另一个子组件,这样链路就完整了,没看懂我的看下面的参考吧,我也是参考它的结合自己的代码实现

  1. 参考自该问答陶通的回答

版权声明:本文为sky-chen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/sky-chen/p/10975234.html