mayf
2024-09-09 c5ed2b03fb6f53a6144cf4d3a18bf31a9075d67a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<template>
  <div class="base-menu-item-comp">
    <el-submenu
      v-if="hasChildren()"
      :index="item.menuHref"
      :class="`level-${level}`"
    >
      <template slot="title">
        <i v-if="item.menuIcon" :class="item.menuIcon"></i>
        <span class="base-menu-item-comp__title">{{ item.menuName }}</span>
      </template>
      <base-menu-item
        v-for="(data, index) in item.children"
        :key="index"
        :item="data"
        :super-path="resolvePath(item.menuHref)"
        :level="level + 1"
      ></base-menu-item>
    </el-submenu>
    <el-menu-item v-else :index="resolvePath(item.menuHref)" @click="goRoute">
      <i v-if="item.menuIcon" :class="item.menuIcon"></i>
      <span class="title">{{ item.menuName }}</span>
    </el-menu-item>
  </div>
</template>
 
<script>
import path from 'path'
 
export default {
  name: 'BaseMenuItem',
  props: {
    item: {
      type: Object,
      required: true,
    },
    superPath: {
      type: String,
      default: '/',
    },
    level: {
      type: Number,
      default: 0,
    },
  },
  methods: {
    hasChildren() {
      if (this.item.children && this.item.children.length > 0) {
        return true
      }
      return false
    },
    goRoute() {
      if (this.item.menuHref.includes('http')) {
        window.open(this.item.menuHref, '_blank')
      } else if (this.item.menuHref.startsWith('/')) {
        this.$router.push(this.item.menuHref)
      } else {
        this.$router.push(this.resolvePath(this.item.menuHref))
      }
    },
    resolvePath(route) {
      if (route.includes('http') || route.startsWith('/')) {
        return route
      }
      return path.join(this.superPath, route).replace(/\\/g, '/')
    },
  },
}
</script>
 
<style scoped lang="scss">
.base-menu-item-comp {
  i {
    color: #fff;
    font-size: 14px;
    margin-right: 16px;
  }
  ::v-deep .el-submenu__icon-arrow {
    color: #fff;
  }
  .el-submenu {
    @for $i from 1 through 4 {
      .el-menu-item {
        padding-left: 64px !important;
      }
      .el-submenu.level-#{$i} {
        ::v-deep {
          .el-submenu__title {
            @if $i==0 {
              padding-left: 20px !important;
            } @else {
              padding-left: 32px * ($i + 1) !important;
            }
          }
        }
        .el-menu-item {
          @if $i==0 {
            padding-left: 64px !important;
          } @else {
            padding-left: 32px * ($i + 1) + 10px !important;
          }
        }
      }
    }
  }
}
</style>