zhouwx
2024-12-04 80c8993820fc3f958397bebe9dbd72be6a449c55
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
109
110
111
112
113
114
115
116
117
118
119
<template>
    <div class="layout-navbars-breadcrumb-index">
        <Logo v-if="setIsShowLogo" />
        <Breadcrumb />
        <Horizontal :menuList="menuList" v-if="isLayoutTransverse" />
        <User />
    </div>
</template>
 
<script lang="ts">
import { computed, reactive, toRefs, onMounted, onUnmounted, getCurrentInstance, defineComponent } from 'vue';
import { useRoute } from 'vue-router';
import { storeToRefs } from 'pinia';
import { useRoutesList } from '/@/stores/routesList';
import { useThemeConfig } from '/@/stores/themeConfig';
import Breadcrumb from '/@/layout/navBars/breadcrumb/breadcrumb.vue';
import User from '/@/layout/navBars/breadcrumb/user.vue';
import Logo from '/@/layout/logo/index.vue';
import Horizontal from '/@/layout/navMenu/horizontal.vue';
 
// 定义接口来定义对象的类型
interface IndexState {
    menuList: object[];
}
 
export default defineComponent({
    name: 'layoutBreadcrumbIndex',
    components: { Breadcrumb, User, Logo, Horizontal },
    setup() {
        const { proxy } = <any>getCurrentInstance();
        const stores = useRoutesList();
        const storesThemeConfig = useThemeConfig();
        const { themeConfig } = storeToRefs(storesThemeConfig);
        const { routesList } = storeToRefs(stores);
        const route = useRoute();
        const state = reactive<IndexState>({
            menuList: [],
        });
        // 设置 logo 显示/隐藏
        const setIsShowLogo = computed(() => {
            let { isShowLogo, layout } = themeConfig.value;
            return (isShowLogo && layout === 'classic') || (isShowLogo && layout === 'transverse');
        });
        // 设置是否显示横向导航菜单
        const isLayoutTransverse = computed(() => {
            let { layout, isClassicSplitMenu } = themeConfig.value;
            return layout === 'transverse' || (isClassicSplitMenu && layout === 'classic');
        });
        // 设置/过滤路由(非静态路由/是否显示在菜单中)
        const setFilterRoutes = () => {
            let { layout, isClassicSplitMenu } = themeConfig.value;
            if (layout === 'classic' && isClassicSplitMenu) {
                state.menuList = delClassicChildren(filterRoutesFun(routesList.value));
                const resData = setSendClassicChildren(route.path);
                proxy.mittBus.emit('setSendClassicChildren', resData);
            } else {
                state.menuList = filterRoutesFun(routesList.value);
            }
        };
        // 设置了分割菜单时,删除底下 children
        const delClassicChildren = (arr: Array<object>) => {
            arr.map((v: any) => {
                if (v.children) delete v.children;
            });
            return arr;
        };
        // 路由过滤递归函数
        const filterRoutesFun = (arr: Array<string>) => {
            return arr
                .filter((item: any) => !item.meta.isHide)
                .map((item: any) => {
                    item = Object.assign({}, item);
                    if (item.children) item.children = filterRoutesFun(item.children);
                    return item;
                });
        };
        // 传送当前子级数据到菜单中
        const setSendClassicChildren = (path: string) => {
            const currentPathSplit = path.split('/');
            let currentData: any = {};
            filterRoutesFun(routesList.value).map((v, k) => {
                if (v.path === `/${currentPathSplit[1]}`) {
                    v['k'] = k;
                    currentData['item'] = [{ ...v }];
                    currentData['children'] = [{ ...v }];
                    if (v.children) currentData['children'] = v.children;
                }
            });
            return currentData;
        };
        // 页面加载时
        onMounted(() => {
            setFilterRoutes();
            proxy.mittBus.on('getBreadcrumbIndexSetFilterRoutes', () => {
                setFilterRoutes();
            });
        });
        // 页面卸载时
        onUnmounted(() => {
            proxy.mittBus.off('getBreadcrumbIndexSetFilterRoutes', () => {});
        });
        return {
            setIsShowLogo,
            isLayoutTransverse,
            ...toRefs(state),
        };
    },
});
</script>
 
<style scoped lang="scss">
.layout-navbars-breadcrumb-index {
    height: 80px;
    display: flex;
    align-items: center;
    background: var(--next-bg-topBar);
    border-bottom: 1px solid var(--next-border-color-light);
}
</style>