155 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <section class="mainContent">
 | |
|     <el-tabs class="layout" type="card" :value="currentTab" @tab-click="handleTabClick" @tab-remove="handleTabRemove">
 | |
|       <el-tab-pane label="首页" name="0"/>
 | |
|       <el-tab-pane v-for="op in tabs" :key="op.name" :name="op.name" :label="op.label" lazy closable/>
 | |
|     </el-tabs>
 | |
|     <div class="fill">
 | |
|       <router-view/>
 | |
|       <ai-empty v-if="currentTab=='0'">欢迎使用村微产品库</ai-empty>
 | |
|     </div>
 | |
|   </section>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| import {mapState} from "vuex";
 | |
| 
 | |
| export default {
 | |
|   name: "mainContent",
 | |
|   computed: {
 | |
|     ...mapState(['apps']),
 | |
|     currentTab() {
 | |
|       let {name, query, hash} = this.$route
 | |
|       return [name?.replace(query?.id, ''), query?.id, hash].join("") || "0"
 | |
|     }
 | |
|   },
 | |
|   data() {
 | |
|     return {
 | |
|       tabs: []
 | |
|     }
 | |
|   },
 | |
|   watch: {
 | |
|     $route: {
 | |
|       immediate: true,
 | |
|       handler() {
 | |
|         this.getTabs()
 | |
|       }
 | |
|     },
 | |
|   },
 | |
|   methods: {
 | |
|     handleTabClick({name}) {
 | |
|       if (name == '0') {
 | |
|         this.$router.push("/")
 | |
|       } else {
 | |
|         let {name: route, query, hash} = this.tabs.find(e => e.name == name),
 | |
|             exps = []
 | |
|         query.id && exps.push(query.id)
 | |
|         hash && exps.push(hash)
 | |
|         let reg = new RegExp(`(${exps.join("|")})`, 'g')
 | |
|         this.$router.push({name: route.replace(reg, ''), query, hash})
 | |
|       }
 | |
|     },
 | |
|     handleTabRemove(id = this.currentTab) {
 | |
|       let tabs = JSON.parse(JSON.stringify(this.tabs)),
 | |
|           index = tabs?.findIndex(e => id == e.name)
 | |
|       if (id == this.currentTab) {
 | |
|         let next = tabs?.[index + 1] || tabs?.[index - 1]
 | |
|         next ? this.handleTabClick(next) : this.$router.push({path: '/'})
 | |
|       }
 | |
|       this.tabs.splice(index, 1)
 | |
|     },
 | |
|     getTabs() {
 | |
|       let {name, query, hash} = this.$route
 | |
|       let tab = this.tabs.find(e => e.name == this.currentTab),
 | |
|           tabName = [name, query?.id, hash].join("")
 | |
|       if (tab) {
 | |
|       } else if (!name) {
 | |
|       } else if (tabName) {
 | |
|         let menu = this.apps.find(e => e.name == name)
 | |
|         this.tabs.push({name: tabName, query, hash, label: menu?.label})
 | |
|       }
 | |
|     },
 | |
|   }
 | |
| }
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
| .mainContent {
 | |
|   height: 100%;
 | |
|   width: 100%;
 | |
|   display: flex;
 | |
|   flex-direction: column;
 | |
| 
 | |
|   :deep(.layout ){
 | |
|     background: #F5F6F9;
 | |
|     display: flex;
 | |
|     flex-direction: column;
 | |
| 
 | |
|     & > .el-tabs__header {
 | |
|       margin-bottom: 0;
 | |
|       background: linear-gradient(180deg, #FCFCFC 0%, #E0E2E4 100%);
 | |
|       height: 40px;
 | |
|       display: flex;
 | |
|       align-items: flex-end;
 | |
|       border: none;
 | |
| 
 | |
|       .el-tabs__nav {
 | |
|         border: none;
 | |
|       }
 | |
| 
 | |
|       .el-tabs__item {
 | |
|         padding: 0 8px 0 12px !important;
 | |
|         text-align: left;
 | |
|         min-width: 130px;
 | |
|         height: 36px;
 | |
|         line-height: 36px;
 | |
|         border: none;
 | |
|         color: #555;
 | |
|         font-size: 12px;
 | |
| 
 | |
|         & + .el-tabs__item {
 | |
|           margin-left: 2px;
 | |
|         }
 | |
| 
 | |
|         .el-icon-close {
 | |
|           float: right;
 | |
|           width: auto;
 | |
|           height: 100%;
 | |
|           line-height: 36px;
 | |
|           background: transparent;
 | |
|           font-size: 16px;
 | |
|           color: #89b;
 | |
| 
 | |
|           &:hover {
 | |
|             color: #000;
 | |
|           }
 | |
|         }
 | |
| 
 | |
|         &.is-active {
 | |
|           border: 1px solid #D8DCE3;
 | |
|           border-bottom: none;
 | |
|           border-radius: 4px 4px 0 0;
 | |
|           background: #F5F6F9;
 | |
|           color: #222;
 | |
| 
 | |
|           &:after {
 | |
|             display: none;
 | |
|           }
 | |
|         }
 | |
| 
 | |
|         &:after {
 | |
|           position: absolute;
 | |
|           right: 0;
 | |
|           content: " ";
 | |
|           width: 1px;
 | |
|           background: #D8DCE3;
 | |
|           height: 24px;
 | |
|           top: 50%;
 | |
|           transform: translateY(-50%);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| </style>
 |