SiderMenu.vue 2.49 KB
<template>
  <a-layout-sider class="left-sider">
    <div style="width: 200px">
      <a-menu :selectedKeys="selectedKeys" :openKeys.sync="openKeys" mode="inline" theme="dark">
        <template v-for="item in menuData">
          <a-menu-item v-if="!item.children" :key="item.path" @click="handleMenuClick(item)">
            <a-icon v-if="item.meta.icon" :type="item.meta.icon" />
            <span>{{ item.meta.title }}</span>
          </a-menu-item>
          <sub-menu v-else :key="item.path" :menu-info="item" />
        </template>
      </a-menu>
    </div>
  </a-layout-sider>
</template>
<script>
import SubMenu from './SubMenu'
export default {
  name: 'SiderMenu',
  components: {
    "sub-menu": SubMenu
  },
  watch: {
    '$route.path': function (val) {
      this.selectedKeys = this.selectedKeysMap[val]
      this.openKeys = this.collapsed ? [] : this.openKeysMap[val]
    }
  },
  data() {
    this.selectedKeysMap = {}
    this.openKeysMap = {}
    const menuData = this.getMenuData(this.$router.options.routes)
    return {
      list: [],
      menuData,
      selectedKeys: this.selectedKeysMap[this.$route.path],
      openKeys: this.collapsed ? [] : this.openKeysMap[this.$route.path]
    };
  },
  methods: {
    getMenuData(routes = [], parentKeys = [], selectedKey) {
      const menuData = []
      // console.log('routes==>', routes)

      for (let item of routes) {
        if (item.name && !item.hideInMenu) {

          this.openKeysMap[item.path] = parentKeys
          this.selectedKeysMap[item.path] = [selectedKey || item.path]

          const newItem = { ...item }
          delete newItem.children
          if (item.children && !item.hideChildrenInMenu) {
            newItem.children = this.getMenuData(item.children, [...parentKeys, item.path])
          } else {
            this.getMenuData(
              item.children,
              selectedKey ? parentKeys : [...parentKeys, item.path],
              selectedKey || item.path
            )
          }
          menuData.push(newItem)
        } else if (!item.hideInMenu && !item.hideChildrenInMenu && item.children) {
          menuData.push(...this.getMenuData(item.children, [...parentKeys, item.path]))
        }
      }

      // console.log('parentKeys==>', parentKeys)
      // console.log('selectedKey==>', selectedKey)
      // console.log('menuData==>', menuData)
      return menuData;
    },
    handleMenuClick(item) {
      console.log(11,item)
      this.$router.push({ path: item.path, query: $route.query })
    }
  }
}
</script>