App.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <template>
  2. <div id="app">
  3. <div class="centerContent">
  4. <sidebar v-if="showSidebar"></sidebar>
  5. <div id="right">
  6. <topbar v-if="showSidebar" :key="1"></topbar>
  7. <el-divider v-if="showSidebar"></el-divider>
  8. <tabbar v-if="showSidebar" :clickIndex='nowindex' :dataList='editableTabs' @itemclick='itemclick' @remove="remove"></tabbar>
  9. <div class="content">
  10. <keep-alive :include="include">
  11. <router-view id="main" />
  12. </keep-alive>
  13. </div>
  14. </div>
  15. </div>
  16. </div>
  17. </template>
  18. <script>
  19. import {
  20. menuRouter,
  21. otherRouter
  22. } from '@/router/routes.js'
  23. import store from '@/store/index'
  24. import sidebar from './components/sidebar/index.vue'
  25. import topbar from './components/topbar.vue'
  26. import tabbar from './components/tabbar.vue'
  27. export default {
  28. name: 'App',
  29. components: {
  30. sidebar,
  31. topbar,tabbar
  32. },
  33. data() {
  34. return {
  35. include: [],
  36. menuDatas: [],
  37. otherDatas: [],
  38. allDatas:[],
  39. editableTabs: [],
  40. // nowindex:0
  41. }
  42. },
  43. mounted(){
  44. },
  45. computed: {
  46. showSidebar() {
  47. return this.$route.name != 'login';
  48. },
  49. nowindex(){
  50. return store?.getters?.getTabIndex
  51. }
  52. },
  53. created() {
  54. menuRouter.forEach(item => {
  55. if (item.name) {
  56. this.menuDatas.push(item);
  57. this.allDatas.push(item)
  58. }
  59. });
  60. otherRouter.forEach(item => {
  61. if (item.name && (item.name != 'login')) {
  62. this.otherDatas.push(item);
  63. this.allDatas.push(item)
  64. }
  65. });
  66. this.editableTabs=store?.getters?.getTabList
  67. },
  68. watch: {
  69. nowindex(val,newval){
  70. this.$router.push(this.editableTabs[val].path)
  71. },
  72. $route(to, from) {
  73. if (to.meta.keepAlive) {
  74. !this.include.includes(to.name) && this.include.push(to.name);
  75. }
  76. if (to.meta.parentNode && to.meta.parentNode.indexOf(from.name) > -1) {
  77. !this.include.includes(from.name) && this.include.push(from.name);
  78. } else if (from.meta.parentNode && from.meta.parentNode.indexOf(to.name) > -1) {} else {
  79. if (from.meta.parentNode) {
  80. var index = this.include.indexOf(from.meta.parentNode);
  81. index !== -1 && this.include.splice(index, 1);
  82. }
  83. if (!from.meta.parentNode) {
  84. var index = this.include.indexOf(from.name);
  85. index !== -1 && this.include.splice(index, 1);
  86. }
  87. }
  88. // 标签页
  89. if (to.name != 'login') {
  90. this.menuDatas.forEach(element => {
  91. if (element.name == to.name) {
  92. let isclear=true
  93. this.editableTabs.forEach(element2 => {
  94. if(element2.name==to.meta.title){
  95. isclear=false //当前页面为菜单页面且不在当前tab中
  96. }
  97. })
  98. if(isclear){
  99. this.editableTabs = []
  100. }
  101. }
  102. });
  103. let isAdd=true
  104. this.editableTabs.forEach((element2,index) => {
  105. if(element2.name==to.meta.title){
  106. isAdd=false //当前页面在tab中
  107. // this.nowindex=index
  108. store.commit("SET_TABINDEX",index)
  109. }
  110. })
  111. if(isAdd){
  112. this.editableTabs.push({name:to.meta.title,path:to.path})
  113. // this.nowindex=this.editableTabs.length-1
  114. store.commit("SET_TABINDEX",this.editableTabs.length-1)
  115. }
  116. store.commit("SET_TABLIST",this.editableTabs)
  117. }
  118. }
  119. },
  120. methods: {
  121. remove(item,index){
  122. // this.nowindex--
  123. store.commit("SET_TABINDEX",index-1)
  124. this.editableTabs.splice(index,1)
  125. store.commit("SET_TABLIST",this.editableTabs)
  126. },
  127. itemclick(item,index){
  128. // this.nowindex=index
  129. store.commit("SET_TABINDEX",index)
  130. },
  131. }
  132. }
  133. </script>
  134. <style lang="less">
  135. @import "app.less";
  136. </style>