| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- <template>
- <div class="menu-bar-container">
- <!-- logo -->
- <div
- class="logo flex a-c j-c"
- :style="{'background-color':themeColor}"
- :class="collapse?'menu-bar-collapse-width':'menu-bar-width'"
- @click="$router.push('/')"
- >
- <img v-if="collapse" src="@/assets/image/logo.png" />
- <div v-if="!collapse" class="flex j-c a-c">
- <img src="@/assets/image/logo.png" />
- <span>{{appName}}</span>
- </div>
- </div>
- <!-- 导航菜单 -->
- <el-menu
- ref="navmenu"
- :default-active="menuIndex"
- :class="collapse?'menu-bar-collapse-width':'menu-bar-width'"
- :collapse="collapse"
- :collapse-transition="false"
- :unique-opened="true"
- @open="handleopen"
- @close="handleclose"
- @select="handleselect"
- background-color="#393D49"
- text-color="#fff"
- active-text-color="#fff"
- >
- <!-- 导航菜单树组件,动态加载菜单 -->
- <menu-tree v-for="item in leftTree" :key="item.id" :menu="item"></menu-tree>
- </el-menu>
- </div>
- </template>
- <script>
- import { mapState } from "vuex";
- import MenuTree from "@/components/MenuTree";
- export default {
- components: {
- MenuTree
- },
- computed: {
- ...mapState({
- appName: state => state.app.appName,
- themeColor: state => state.app.themeColor,
- collapse: state => state.app.collapse,
- navTree: state => state.menu.navTree,
- leftTree: state => state.menu.leftTree
- }),
- mainTabs: {
- get() {
- return this.$store.state.tab.mainTabs;
- },
- set(val) {
- this.$store.commit("updateMainTabs", val);
- }
- },
- mainTabsActiveName: {
- get() {
- return this.$store.state.tab.mainTabsActiveName;
- },
- set(val) {
- this.$store.commit("updateMainTabsActiveName", val);
- }
- }
- },
- watch: {
- $route: "handleRoute"
- },
- data(){
- return{
- menuIndex: this.$route.meta.index!==0?this.$route.meta.index:this.leftTree[0].id
- }
- },
- created() {
- this.handleRoute(this.$route);
- },
- methods: {
- handleopen() {},
- handleclose() {},
- handleselect(a, b) {},
- // 路由操作处理
- handleRoute(route) {
- // tab标签页选中, 如果不存在则先添加
- var tab = this.mainTabs.filter(item => item.name === route.name)[0];
- if (!tab) {
- tab = {
- name: route.name,
- title: route.name,
- icon: route.meta.icon
- };
- this.mainTabs = this.mainTabs.concat(tab);
- }
- this.mainTabsActiveName = tab.name;
- // 切换标签页时同步更新高亮菜单
- if (this.$refs.navmenu != null) {
- this.$refs.navmenu.activeIndex = "" + route.meta.index;
- this.$refs.navmenu.initOpenedMenu();
- }
- }
- }
- };
- </script>
- <style scoped lang="scss">
- .menu-bar-container {
- position: fixed;
- top: 0px;
- left: 0;
- bottom: 0;
- z-index: 1020;
- .el-menu {
- position: absolute;
- top: 60px;
- bottom: 0px;
- text-align: left;
- }
- .logo {
- position: absolute;
- top: 0px;
- height: 60px;
- line-height: 60px;
- background: #545c64;
- cursor: pointer;
- img {
- width: 40px;
- height: 40px;
- border-radius: 0px;
- margin-right: 10px;
- float: left;
- }
- div {
- font-size: 25px;
- color: white;
- text-align: left;
- }
- }
- .menu-bar-width {
- width: 220px;
- overflow-y: auto;
- }
- .menu-bar-collapse-width {
- width: 65px;
- }
- }
- </style>
|