Skip to content

Commit d32087c

Browse files
author
sunss
committed
feat: 添加路由动效,抽离Breadcrumb组件
1 parent 3650a53 commit d32087c

File tree

4 files changed

+143
-20
lines changed

4 files changed

+143
-20
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<template>
2+
<a-card>
3+
<a-breadcrumb :routes="breadcrumb">
4+
<template #itemRender="{ route }">
5+
<span class="font14 color-666">
6+
{{ route.breadcrumbName }}
7+
</span>
8+
</template>
9+
</a-breadcrumb>
10+
<h2 class="font18 marT13 rowSC link" @click="handleBreadcrumb">
11+
<LeftOutlined />
12+
<span class="marL10">{{ title }}</span>
13+
</h2>
14+
</a-card>
15+
</template>
16+
<script setup lang="ts">
17+
import { LeftOutlined } from '@ant-design/icons-vue';
18+
import { Route } from 'ant-design-vue/es/breadcrumb/Breadcrumb';
19+
import { useBreadcrumbTitle } from '/@/hooks/useBreadcrumbTitle';
20+
21+
const { title } = useBreadcrumbTitle();
22+
const router = useRouter();
23+
24+
const emits = defineEmits(['handleClick']);
25+
26+
const breadcrumb = computed(
27+
() =>
28+
router.currentRoute.value.matched
29+
.filter((n) => !['/', '/app'].includes(n.path))
30+
.map((item) => {
31+
return {
32+
path: item.path,
33+
breadcrumbName: item.meta.title || '',
34+
};
35+
}) as Route[],
36+
);
37+
38+
const handleBreadcrumb = () => {
39+
emits('handleClick', breadcrumb.value);
40+
};
41+
</script>
42+
<style scoped>
43+
.link {
44+
text-decoration: none;
45+
}
46+
</style>

src/layouts/BasicLayout/index.vue

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,7 @@
55
<SideMenu v-bind="layoutConf" />
66
<a-layout class="basicLayout-content">
77
<!-- breadcrumb -->
8-
<a-card v-if="routeMeta.breadcrumb">
9-
<a-breadcrumb :routes="breadcrumb">
10-
<template #itemRender="{ route }">
11-
<span class="font14 color-666">
12-
{{ route.breadcrumbName }}
13-
</span>
14-
</template>
15-
</a-breadcrumb>
16-
<h2 class="font18 marT13 rowSC link" @click="handleBreadcrumb">
17-
<LeftOutlined />
18-
<span class="marL10">{{ title }}</span>
19-
</h2>
20-
</a-card>
8+
<Breadcrumb v-if="routeMeta.breadcrumb" @handleClick="handleBreadcrumb" />
219

2210
<!-- content -->
2311
<a-layout-content>
@@ -26,14 +14,23 @@
2614
<!-- router-view -->
2715
<template v-if="routeMeta.hiddenWrap">
2816
<!-- <router-view /> -->
29-
<router-view v-slot="{ Component }">
30-
<component :is="Component" />
17+
<router-view v-slot="{ Component, route }">
18+
<transition name="fade-slide" mode="out-in" appear>
19+
<!-- https://www.jianshu.com/p/399667ec9ef8 -->
20+
<div :key="route.name">
21+
<component :is="Component" />
22+
</div>
23+
</transition>
3124
</router-view>
3225
</template>
3326
<a-card v-else>
3427
<!-- <router-view /> -->
35-
<router-view v-slot="{ Component }">
36-
<component :is="Component" />
28+
<router-view v-slot="{ Component, route }">
29+
<transition name="fade-slide" mode="out-in" appear>
30+
<div :key="route.name">
31+
<component :is="Component" />
32+
</div>
33+
</transition>
3734
</router-view>
3835
</a-card>
3936
</a-layout-content>
@@ -42,15 +39,12 @@
4239
</a-layout>
4340
</template>
4441
<script setup lang="ts">
45-
import { LeftOutlined } from '@ant-design/icons-vue';
4642
import { Route } from 'ant-design-vue/es/breadcrumb/Breadcrumb';
4743
import Header from './components/Header.vue';
4844
import SideMenu from './components/SideMenu';
49-
import { useBreadcrumbTitle } from '/@/hooks/useBreadcrumbTitle';
5045
import { clearMenuItem, filterRoutes } from './utils';
5146
5247
const router = useRouter();
53-
const { title } = useBreadcrumbTitle();
5448
5549
const menuData = filterRoutes(
5650
clearMenuItem(router.getRoutes()).filter((n) => n.path.startsWith('/app/')),

src/styles/index.less

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
@import './transition.less';
12
@import './variables.less';
23
@import './common.less';
34
@import './public.less';

src/styles/transition.less

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
// fade
2+
.fade-enter-active,
3+
.fade-leave-active {
4+
transition: opacity 0.2s ease-in-out;
5+
}
6+
7+
.fade-enter-from,
8+
.fade-leave-to {
9+
opacity: 0;
10+
}
11+
12+
/* fade-slide */
13+
.fade-slide-leave-active,
14+
.fade-slide-enter-active {
15+
transition: all 0.3s;
16+
}
17+
18+
.fade-slide-enter-from {
19+
opacity: 0;
20+
transform: translateX(-30px);
21+
}
22+
23+
.fade-slide-leave-to {
24+
opacity: 0;
25+
transform: translateX(30px);
26+
}
27+
28+
// ///////////////////////////////////////////////
29+
// Fade Bottom
30+
// ///////////////////////////////////////////////
31+
32+
// Speed: 1x
33+
.fade-bottom-enter-active,
34+
.fade-bottom-leave-active {
35+
transition: opacity 0.25s, transform 0.3s;
36+
}
37+
38+
.fade-bottom-enter-from {
39+
opacity: 0;
40+
transform: translateY(-10%);
41+
}
42+
43+
.fade-bottom-leave-to {
44+
opacity: 0;
45+
transform: translateY(10%);
46+
}
47+
48+
// fade-scale
49+
.fade-scale-leave-active,
50+
.fade-scale-enter-active {
51+
transition: all 0.28s;
52+
}
53+
54+
.fade-scale-enter-from {
55+
opacity: 0;
56+
transform: scale(1.2);
57+
}
58+
59+
.fade-scale-leave-to {
60+
opacity: 0;
61+
transform: scale(0.8);
62+
}
63+
64+
// ///////////////////////////////////////////////
65+
// Fade Top
66+
// ///////////////////////////////////////////////
67+
68+
// Speed: 1x
69+
.fade-top-enter-active,
70+
.fade-top-leave-active {
71+
transition: opacity 0.2s, transform 0.25s;
72+
}
73+
74+
.fade-top-enter-from {
75+
opacity: 0;
76+
transform: translateY(8%);
77+
}
78+
79+
.fade-top-leave-to {
80+
opacity: 0;
81+
transform: translateY(-8%);
82+
}

0 commit comments

Comments
 (0)