feat: 初始化提交
笑笑 authored at 2025-05-13 21:25:06
1.79 KiB
cube-front
<template>
  <div class="menu-cascader-second">
    <div :class="['menu-cascader-second-title']" :style="{ width }">
      {{ renderMenuTitle(menu) }}
    </div>
    <div class="menu-cascader-second-item-wrap" :style="{ width }">
      <SecondCascaderMenuItem
        v-for="leaf in menu.children || []"
        :key="leaf.id"
        :menu="leaf"
        :active-menu="activeMenu"
        :on-menu-click="onMenuClick || ((menu) => {})"
      />
    </div>
  </div>
</template>

<script setup lang="ts">
import { type TreeMenuItem } from 'cube-front/core/stores/menu';
import { renderMenuTitle } from 'cube-front/core/utils/menuHelpers';
import SecondCascaderMenuItem from './SecondCascaderMenuItem.vue';
import { computed } from 'vue';

/**
 * 二级层叠菜单组件Props接口定义
 */
interface SecondCascaderMenuProps {
  /** 菜单项 */
  menu: TreeMenuItem;
  /** 宽度 */
  width: string;
  /** 单行菜单项数量 */
  menuItemColumns: number;
  /** 激活菜单项 */
  activeMenu?: TreeMenuItem;
  /** 菜单点击回调函数 */
  onMenuClick?: (menu: TreeMenuItem) => void;
}

const props = defineProps<SecondCascaderMenuProps>();

const menuItemColumns = computed(() => props.menuItemColumns);
</script>

<style lang="scss" scoped>
.menu-cascader-second {
  padding-bottom: 16px;

  .menu-cascader-second-title {
    letter-spacing: 0;
    height: 40px;
    margin-left: 16px;
    padding-left: 20px;
    color: #333;
    font-weight: 700;
    border-bottom: 1px solid #f1f1f1;
    font-size: 16px;
    line-height: 40px;
    overflow: hidden;
    text-overflow: ellipsis;
    word-break: break-all;
    white-space: nowrap;
  }

  .menu-cascader-second-item-wrap {
    margin-top: 8px;
    display: grid;
    grid-template-columns: repeat(v-bind(menuItemColumns), 1fr);
    width: 100%;
    gap: 0;
  }
}
</style>