hagerMenu.vue 6.31 KB
<!--
 * @Date: 2024-10-10 10:37:16
 * @LastEditors: hookehuyr hookehuyr@gmail.com
 * @LastEditTime: 2024-12-12 13:50:39
 * @FilePath: /hager/src/components/hagerMenu.vue
 * @Description: 文件描述
-->
<template>
  <div class="hager-menu-page">
    <div class="menu-wrapper" @click="toggleTop()">
      <div class="menu-title">产品中心</div>
      <div>
        <i
          v-if="isToggle"
          class="el-icon-arrow-up"
          style="font-size: 1.25rem; color: #F56400;"
        ></i>
        <i v-else class="el-icon-arrow-down" style="font-size: 1.25rem; color: #F56400;"></i>
      </div>
    </div>
    <div v-if="isToggle" class="menu">
      <div v-for="(item, index) in menuData" :key="item.id" class="menu-item">
        <!-- 一级菜单 -->
        <div
          @click="goToSub(item.id)"
          :class="['menu-label', activeMenu === item.id ? 'active' : '']"
        >
          <div style="display: flex; align-items: center;">
            <el-image style="width: 1rem; height: 1rem;" :src="item.icon" fit="fit"></el-image>&nbsp;
            {{ item.category_name }}
          </div>
          <div @click.stop="toggleMenu(item.id)">
            <i
              v-if="isActive(item.id)"
              class="el-icon-arrow-up"
              style="font-size: 1.25rem; color: #F56400;"
            ></i>
            <i v-else class="el-icon-arrow-down" style="font-size: 1.25rem; color: #F56400;"></i>
          </div>
        </div>

        <!-- 二级菜单 -->
        <div v-if="isActive(item.id)" class="submenu">
          <div v-for="subItem in item.children" :key="subItem.id" class="submenu-item">
            <div class="submenu-label">
              <div @click="goToSub(subItem.id)">{{ subItem.category_name }}</div>
              <div @click="toggleSubMenu(subItem.id)">
                <i
                  v-if="isSubActive(subItem.id)"
                  class="el-icon-arrow-up"
                  style="font-size: 1.25rem; color: #F56400;"
                ></i>
                <i v-else class="el-icon-arrow-down" style="font-size: 1.25rem; color: #F56400;"></i>
              </div>
            </div>

            <!-- 三级菜单 -->
            <div v-if="isSubActive(subItem.id)" class="third-menu">
              <div
                @click="goToThird(thirdItem.id)"
                v-for="thirdItem in subItem.list"
                :key="thirdItem.id"
                class="third-item"
              >
                {{ thirdItem.product_name }}
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
    <div class="menu-wrapper" @click="goTo('/solution/index')">
      <div class="menu-title">解决方案</div>
    </div>
    <div class="menu-wrapper" @click="goTo('/news')">
      <div class="menu-title">新闻中心</div>
    </div>
    <div class="menu-wrapper" @click="goTo('/recruit')">
      <div class="menu-title">招聘信息</div>
    </div>
    <div class="menu-wrapper" @click="goTo('/about')">
      <div class="menu-title">关于海格</div>
    </div>
    <div class="menu-wrapper" @click="goTo('/contact')">
      <div class="menu-title">联系我们</div>
    </div>
    <div class="menu-wrapper" @click="goTo('/')">
      <div class="menu-title">首页</div>
    </div>
  </div>
</template>

<script>
import mixin from "common/mixin";

export default {
  mixins: [mixin.init],
  props: {
    menuData: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      isToggle: false,
      activeMenu: null, // 当前展开的一级菜单ID
      activeSubMenu: null, // 当前展开的二级菜单ID
    };
  },
  mounted() {},
  methods: {
    // 切换一级菜单展开状态
    toggleMenu(menuId) {
      if (this.activeMenu === menuId) {
        this.activeMenu = null; // 如果已展开,点击后关闭
        this.activeSubMenu = null; // 同时关闭二级菜单
      } else {
        this.activeMenu = menuId; // 展开新的一级菜单
        this.activeSubMenu = null; // 同时重置二级菜单
      }
    },

    // 切换二级菜单展开状态
    toggleSubMenu(subMenuId) {
      if (this.activeSubMenu === subMenuId) {
        this.activeSubMenu = null; // 如果已展开,点击后关闭
      } else {
        this.activeSubMenu = subMenuId; // 展开新的二级菜单
      }
    },

    // 判断一级菜单是否为激活状态
    isActive(menuId) {
      return this.activeMenu === menuId;
    },

    // 判断二级菜单是否为激活状态
    isSubActive(subMenuId) {
      return this.activeSubMenu === subMenuId;
    },

    goToSub(id) {
      this.$emit("close");
      this.$router.push({
        path: `/product/index/${id}`,
      });
    },
    goToThird(id) {
      this.$emit("close");
      this.$router.push({
        path: `/product/detail/${id}`,
      });
    },
    //
    toggleTop(v) {
      this.isToggle = !this.isToggle;
    },
    goTo (path) { // 跳转页面
      this.$emit("close");
      if (this.$route.path !== path) { // 不能重复点击当前页面
        this.$router.push({
          path,
        });
      }
    },
  },
};
</script>

<style lang="less" scoped>
.hager-menu-page {
  height: 100%;
  overflow: scroll;
  background-color: #FFF;
  .menu-wrapper {
    display: flex;
    align-items: center;
    padding: 1rem;
    justify-content: space-between;
    // padding-bottom: 0;
    border-bottom: 1px solid #F9F9F9;
    .menu-title {
      color: @secondary-color;
    }
  }
  .menu {
    width: 100%;
  }

  .menu-item {
    cursor: pointer;
  }

  .menu-label {
    // font-weight: bold;
    padding: 1rem;
    display: flex;
    align-items: center;
    justify-content: space-between;
    &.active {
      background-color: #fff;
    }
  }

  .submenu {
    padding-left: 20px;
    background-color: #F7F7F7;
  }

  .submenu-item {
    padding: 5px 0;
    cursor: pointer;
    .submenu-label {
      padding: 0.5rem 1rem;
      padding-bottom: 0;
      display: flex;
      align-items: center;
      justify-content: space-between;
    }
  }

  .third-menu {
    margin-left: 20px;
    // color: #555;
  }

  .third-item {
    margin: 0.6rem 1rem 0.3rem;
    cursor: pointer;
    overflow: hidden;
    text-overflow: ellipsis;
    line-clamp: 1;
    display: -webkit-box;
    -webkit-line-clamp: 1;
    -webkit-box-orient: vertical;
    &:hover {
      color: #ee6d10;
      text-decoration: underline;
    }
  }
}
</style>