Files
weather-data/weather-data-ui/src/layout/sidebar/sidebar-menus-items.vue
T

52 lines
1.9 KiB
Vue
Raw Normal View History

2026-06-26 17:39:57 +08:00
<script lang="ts">
import { defineComponent, PropType } from "vue";
import classNames from "classnames";
import SvgIcon from "@/components/base/svg-icon";
import { RouteRecordRaw } from "vue-router";
export default defineComponent({
name: "SidebarMenusItems",
components: { SvgIcon },
props: {
menus: Array as PropType<RouteRecordRaw[]>,
hiddenIndex: Number,
className: String
},
setup(props) {
const getStyle = (index: number): string => {
const styles: Array<any> = [];
const isHidden = props.hiddenIndex ? props.hiddenIndex > -1 && index > props.hiddenIndex : false;
styles.push("display:" + (isHidden ? "none" : "block"));
return styles.join(";");
};
return { props, classNames, getStyle };
}
});
</script>
<template>
<template v-for="(x, index) in props.menus || []" :key="x.path">
<el-sub-menu v-if="x.children && x.children.length > 0" :index="x.path" :popper-class="props.className" :class="classNames({ isMore: x.meta?.isMore })" :style="getStyle(index)">
<template #title>
<el-icon v-if="x.meta?.icon !== false">
<svg-icon :name="`${x.meta?.icon || 'icon-file-fill'}`"></svg-icon>
</el-icon>
<span>
<a>{{ x.meta?.title }}</a>
</span>
</template>
<sidebar-menus-items :menus="x.children"></sidebar-menus-items>
</el-sub-menu>
<el-menu-item v-else :index="x.meta?.isNewPage ? x.path : x.path" :class="classNames({ isLink: !!x.meta?.isNewPage, isMore: x.meta?.isMore })" :style="getStyle(index)">
<template #title>
<a v-if="x.meta?.isNewPage" :href="`${x.meta.url}`" target="_blank" rel="opener">
{{ x.meta.title }}
</a>
<a v-else>{{ x.meta?.title }}</a>
</template>
<el-icon v-if="x.meta?.icon !== false">
<svg-icon :name="`${x.meta?.icon || 'icon-file-fill'}`"></svg-icon>
</el-icon>
</el-menu-item>
</template>
</template>