| <template> | 
|   <el-menu | 
|     :default-active="activeMenu" | 
|     mode="horizontal" | 
|     @select="handleSelect" | 
|   > | 
|     <template v-for="(item, index) in topMenus"> | 
|       <el-menu-item :style="{'--theme': theme}" :index="item.path" :key="index" v-if="index < visibleNumber" | 
|         ><svg-icon :icon-class="item.meta.icon" /> | 
|         {{ item.meta.title }}</el-menu-item | 
|       > | 
|     </template> | 
|   | 
|     <!-- 顶部菜单超出数量折叠 --> | 
|     <el-submenu :style="{'--theme': theme}" index="more" v-if="topMenus.length > visibleNumber"> | 
|       <template slot="title">更多菜单</template> | 
|       <template v-for="(item, index) in topMenus"> | 
|         <el-menu-item | 
|           :index="item.path" | 
|           :key="index" | 
|           v-if="index >= visibleNumber" | 
|           ><svg-icon :icon-class="item.meta.icon" /> | 
|           {{ item.meta.title }}</el-menu-item | 
|         > | 
|       </template> | 
|     </el-submenu> | 
|   </el-menu> | 
| </template> | 
|   | 
| <script> | 
| import { constantRoutes } from "@/router"; | 
|   | 
| // 隐藏侧边栏路由 | 
| const hideList = ['/index', '/user/profile']; | 
|   | 
| export default { | 
|   data() { | 
|     return { | 
|       // 顶部栏初始数 | 
|       visibleNumber: 5, | 
|       // 当前激活菜单的 index | 
|       currentIndex: undefined | 
|     }; | 
|   }, | 
|   computed: { | 
|     theme() { | 
|       return this.$store.state.settings.theme; | 
|     }, | 
|     // 顶部显示菜单 | 
|     topMenus() { | 
|       let topMenus = []; | 
|       this.routers.map((menu) => { | 
|         if (menu.hidden !== true) { | 
|           // 兼容顶部栏一级菜单内部跳转 | 
|           if (menu.path === "/") { | 
|               topMenus.push(menu.children[0]); | 
|           } else { | 
|               topMenus.push(menu); | 
|           } | 
|         } | 
|       }); | 
|       return topMenus; | 
|     }, | 
|     // 所有的路由信息 | 
|     routers() { | 
|       return this.$store.state.permission.topbarRouters; | 
|     }, | 
|     // 设置子路由 | 
|     childrenMenus() { | 
|       var childrenMenus = []; | 
|       this.routers.map((router) => { | 
|         for (var item in router.children) { | 
|           if (router.children[item].parentPath === undefined) { | 
|             if(router.path === "/") { | 
|               router.children[item].path = "/" + router.children[item].path; | 
|             } else { | 
|               if(!this.ishttp(router.children[item].path)) { | 
|                 router.children[item].path = router.path + "/" + router.children[item].path; | 
|               } | 
|             } | 
|             router.children[item].parentPath = router.path; | 
|           } | 
|           childrenMenus.push(router.children[item]); | 
|         } | 
|       }); | 
|       return constantRoutes.concat(childrenMenus); | 
|     }, | 
|     // 默认激活的菜单 | 
|     activeMenu() { | 
|       const path = this.$route.path; | 
|       let activePath = path; | 
|       if (path !== undefined && path.lastIndexOf("/") > 0 && hideList.indexOf(path) === -1) { | 
|         const tmpPath = path.substring(1, path.length); | 
|         activePath = "/" + tmpPath.substring(0, tmpPath.indexOf("/")); | 
|         if (!this.$route.meta.link) { | 
|           this.$store.dispatch('app/toggleSideBarHide', false); | 
|         } | 
|       } else if(!this.$route.children) { | 
|         activePath = path; | 
|         this.$store.dispatch('app/toggleSideBarHide', true); | 
|       } | 
|       this.activeRoutes(activePath); | 
|       return activePath; | 
|     }, | 
|   }, | 
|   beforeMount() { | 
|     window.addEventListener('resize', this.setVisibleNumber) | 
|   }, | 
|   beforeDestroy() { | 
|     window.removeEventListener('resize', this.setVisibleNumber) | 
|   }, | 
|   mounted() { | 
|     this.setVisibleNumber(); | 
|   }, | 
|   methods: { | 
|     // 根据宽度计算设置显示栏数 | 
|     setVisibleNumber() { | 
|       const width = document.body.getBoundingClientRect().width / 3; | 
|       this.visibleNumber = parseInt(width / 85); | 
|     }, | 
|     // 菜单选择事件 | 
|     handleSelect(key, keyPath) { | 
|       this.currentIndex = key; | 
|       const route = this.routers.find(item => item.path === key); | 
|       if (this.ishttp(key)) { | 
|         // http(s):// 路径新窗口打开 | 
|         window.open(key, "_blank"); | 
|       } else if (!route || !route.children) { | 
|         // 没有子路由路径内部打开 | 
|         this.$router.push({ path: key }); | 
|         this.$store.dispatch('app/toggleSideBarHide', true); | 
|       } else { | 
|         // 显示左侧联动菜单 | 
|         this.activeRoutes(key); | 
|         this.$store.dispatch('app/toggleSideBarHide', false); | 
|       } | 
|     }, | 
|     // 当前激活的路由 | 
|     activeRoutes(key) { | 
|       var routes = []; | 
|       if (this.childrenMenus && this.childrenMenus.length > 0) { | 
|         this.childrenMenus.map((item) => { | 
|           if (key == item.parentPath || (key == "index" && "" == item.path)) { | 
|             routes.push(item); | 
|           } | 
|         }); | 
|       } | 
|       if(routes.length > 0) { | 
|         this.$store.commit("SET_SIDEBAR_ROUTERS", routes); | 
|       } else { | 
|         this.$store.dispatch('app/toggleSideBarHide', true); | 
|       } | 
|     }, | 
|     ishttp(url) { | 
|       return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1 | 
|     } | 
|   }, | 
| }; | 
| </script> | 
|   | 
| <style lang="scss"> | 
| .topmenu-container.el-menu--horizontal > .el-menu-item { | 
|   float: left; | 
|   height: 50px !important; | 
|   line-height: 50px !important; | 
|   color: #999093 !important; | 
|   padding: 0 5px !important; | 
|   margin: 0 10px !important; | 
| } | 
|   | 
| .topmenu-container.el-menu--horizontal > .el-menu-item.is-active, .el-menu--horizontal > .el-submenu.is-active .el-submenu__title { | 
|   border-bottom: 2px solid #{'var(--theme)'} !important; | 
|   color: #303133; | 
| } | 
|   | 
| /* submenu item */ | 
| .topmenu-container.el-menu--horizontal > .el-submenu .el-submenu__title { | 
|   float: left; | 
|   height: 50px !important; | 
|   line-height: 50px !important; | 
|   color: #999093 !important; | 
|   padding: 0 5px !important; | 
|   margin: 0 10px !important; | 
| } | 
| </style> |