Skip to content

Commit 8722e47

Browse files
author
sunshine824
committed
路由优化
1 parent aa9c858 commit 8722e47

File tree

7 files changed

+165
-28
lines changed

7 files changed

+165
-28
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { defineComponent, ref, watch } from 'vue'
2+
import { RouteRecordRaw, useRoute, useRouter } from 'vue-router'
3+
import router from '../../router'
4+
5+
import styles from './index.module.less'
6+
7+
const LevelMenus = defineComponent({
8+
name: 'LevelMenus',
9+
props: {
10+
menuLists: {
11+
type: Array,
12+
default: [],
13+
},
14+
},
15+
setup(props, { slots }) {
16+
const route = useRoute() // 路由实例
17+
18+
const router = useRouter()
19+
20+
const baseUrl = ref(route.path.split('/')) // 当前跳转基础路由
21+
22+
// 路由跳转
23+
const skipTo = (item: RouteRecordRaw) => {
24+
router.push(item.path)
25+
}
26+
27+
// 监听路由变化
28+
watch(route, (val) => {
29+
baseUrl.value = val.path.split('/')
30+
})
31+
32+
return () => (
33+
<div class={styles['level-menus']}>
34+
<ul class={styles['level-menus-list']}>
35+
{(props.menuLists as RouteRecordRaw[]).map((menu) => {
36+
return (
37+
<li
38+
onClick={skipTo.bind(this, menu)}
39+
class={menu.name == baseUrl.value[1] && styles['active']}
40+
>
41+
<span class={`iconfont ${menu?.meta?.icon} menu-icon`}></span>
42+
<span class={styles['title']}>{menu?.meta?.title}</span>
43+
</li>
44+
)
45+
})}
46+
</ul>
47+
</div>
48+
)
49+
},
50+
})
51+
52+
export default LevelMenus

src/components/GlobalHeader/Menus.tsx

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ const Menus = defineComponent({
1111
type: String,
1212
default: 'horizontal',
1313
},
14+
menuLists: {
15+
type: Array,
16+
default: [],
17+
},
1418
},
1519
setup(props, { slots }) {
1620
const route = useRoute()
@@ -25,23 +29,6 @@ const Menus = defineComponent({
2529
return []
2630
})
2731

28-
// 获取显示状态的路由
29-
const menuLists = computed(() => {
30-
return getMenus().filter((item) => !item?.meta?.hidden)
31-
})
32-
33-
// 获取路由列表
34-
const getMenus = () => {
35-
let menuList: RouteRecordRaw[] = []
36-
const routes: Array<RouteRecordRaw> = useRouter().options?.routes || []
37-
routes.forEach((item) => {
38-
if (item.path == '/') {
39-
menuList = item.children || []
40-
}
41-
})
42-
return menuList
43-
}
44-
4532
// 路由跳转
4633
const handleMenuClick = (item: { key: string }) => {
4734
router.push(item.key)
@@ -102,7 +89,7 @@ const Menus = defineComponent({
10289
style={{ lineHeight: '54px' }}
10390
onClick={handleMenuClick}
10491
>
105-
{menuLists['value'].map((menu) => {
92+
{(props.menuLists as RouteRecordRaw[]).map((menu) => {
10693
if (!menu.children || !menu.children.length) {
10794
return (
10895
<Menu.Item key={menu.path}>

src/components/GlobalHeader/index.module.less

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,3 +169,52 @@
169169
}
170170
}
171171
}
172+
173+
.level-menus {
174+
height: 54px;
175+
max-width: 800px;
176+
margin-right: 20px;
177+
.level-menus-list {
178+
display: flex;
179+
flex-flow: row nowrap;
180+
align-items: center;
181+
height: 100%;
182+
margin-bottom: 0;
183+
li {
184+
height: 100%;
185+
display: flex;
186+
flex-flow: row nowrap;
187+
align-items: center;
188+
color: #b0b0b1;
189+
font-size: 15px;
190+
padding: 0 15px;
191+
position: relative;
192+
cursor: pointer;
193+
margin: 0 5px;
194+
&:hover {
195+
color: #fff;
196+
}
197+
:global {
198+
.menu-icon {
199+
margin-right: 15px;
200+
}
201+
}
202+
&::after {
203+
width: 100%;
204+
content: '';
205+
position: absolute;
206+
height: 0px;
207+
bottom: 0;
208+
left: 0;
209+
background: #0972fe;
210+
}
211+
&.active {
212+
background-color: rgba(54, 54, 80, 0.8) !important;
213+
color: #fff;
214+
&::after {
215+
height: 3px;
216+
}
217+
}
218+
}
219+
}
220+
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import GlobalHeader from './GlobalHeader'
22
import Menus from './Menus'
3+
import LevelMenus from './LevelMenus'
34

4-
export { GlobalHeader, Menus }
5+
export { GlobalHeader, Menus, LevelMenus }

src/layouts/LevelBasicLayout.tsx

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,56 @@
1-
import { defineComponent } from 'vue'
2-
import { RouterView } from 'vue-router'
1+
import { defineComponent, computed } from 'vue'
2+
import { RouterView, RouteRecordRaw, useRouter, useRoute } from 'vue-router'
33
import { Layout, Dropdown } from 'ant-design-vue'
4-
import { GlobalHeader, Menus } from '@/components/GlobalHeader'
4+
import { GlobalHeader, Menus, LevelMenus } from '@/components/GlobalHeader'
55

66
import styles from './index.module.less'
77
import UserIcon from '../assets/user.png'
88

99
const LevelBasicLayout = defineComponent({
1010
name: 'LevelBasicLayout',
1111
setup() {
12+
// 获取显示状态的路由
13+
const menuLists = computed(() => {
14+
const menus = getMenus().filter((item: any) => !item?.meta?.hidden)
15+
menus.forEach((item: any) => {
16+
if (item.children) {
17+
// 只取第一层
18+
delete item.children
19+
}
20+
})
21+
return menus
22+
})
23+
24+
// 获取子路由
25+
const subMenuLists = computed(() => {
26+
let menus: RouteRecordRaw[] = []
27+
const names = useRoute().path.split('/')
28+
if (names.length) {
29+
getMenus().forEach((item) => {
30+
if (item.name == names[1]) {
31+
menus = item?.children || []
32+
}
33+
})
34+
}
35+
return menus
36+
})
37+
38+
// 获取路由列表
39+
const getMenus = () => {
40+
let menuList: RouteRecordRaw[] = []
41+
const routes: Array<RouteRecordRaw> = useRouter().options?.routes || []
42+
routes.forEach((item) => {
43+
if (item.path == '/') {
44+
menuList = item.children || []
45+
}
46+
})
47+
return JSON.parse(JSON.stringify(menuList))
48+
}
1249
const slots = {
1350
content: () => (
1451
<>
1552
{/* 导航栏 */}
16-
<Menus></Menus>
53+
<LevelMenus menuLists={menuLists['value']}></LevelMenus>
1754
{/* 用户信息 */}
1855
<div class={styles['user-info']}>
1956
<Dropdown>
@@ -30,7 +67,15 @@ const LevelBasicLayout = defineComponent({
3067
<Layout class={styles['level-layout']}>
3168
<GlobalHeader v-slots={slots}></GlobalHeader>
3269
<div class={styles['level-content']}>
33-
<div class={styles['level-sub-menu']}></div>
70+
{/* 侧边子目录 */}
71+
{subMenuLists['value'].length ? (
72+
<div class={styles['vertical-sub-menu']}>
73+
<Menus menuLists={subMenuLists['value']} mode="inline"></Menus>
74+
</div>
75+
) : (
76+
''
77+
)}
78+
{/* 右侧内容区 */}
3479
<Layout.Content>
3580
<RouterView />
3681
</Layout.Content>

src/layouts/index.module.less

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
flex-flow: row nowrap;
1212
align-items: flex-start;
1313
height: 100%;
14-
.level-sub-menu {
14+
.vertical-sub-menu {
1515
width: 210px;
1616
height: 100%;
1717
background: #fff;
18-
margin-right: 20px;
18+
padding: 20px 10px;
1919
}
2020
}
2121
.user-info {
@@ -70,6 +70,8 @@
7070
height: 100%;
7171
display: flex;
7272
flex-flow: column nowrap;
73+
margin: 0 20px 10px 20px;
74+
padding-bottom: 10px;
7375
.top-info {
7476
background: #f0f2f5;
7577
padding: 10px 10px 10px 0;
@@ -81,6 +83,5 @@
8183
overflow-y: auto;
8284
overflow-x: hidden;
8385
padding: 10px;
84-
margin: 0 20px 10px 0;
8586
}
8687
}

src/router/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,13 @@ function fnAddDynamicMenuRoutes(
3939
},
4040
})
4141
} else if (item.list && item.list.length) {
42+
const menus = fnAddDynamicMenuRoutes(item.list, [])
4243
routes.push({
4344
path: `/${item.url}`,
4445
name: item.url,
4546
component: RouteLayout,
46-
children: fnAddDynamicMenuRoutes(item.list, []),
47+
redirect: menus[0].path,
48+
children: menus,
4749
meta: {
4850
title: item.name,
4951
hidden: false,

0 commit comments

Comments
 (0)