-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathAppMain.vue
83 lines (76 loc) · 1.99 KB
/
AppMain.vue
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
<template>
<section class="app-main">
<router-view v-slot="{ Component, route }">
<transition name="fade-transform" mode="out-in">
<keep-alive :include="cachedViews">
<component :is="wrap(route, Component)" :key="route.fullPath" />
</keep-alive>
</transition>
</router-view>
</section>
</template>
<script>
import { defineComponent, h } from 'vue';
import store from '@/store';
import { mapState } from 'pinia';
export default defineComponent({
name: 'AppMain',
computed: {
...mapState(store.tagsView, ['wrapperMap']),
cachedViews() {
return store.tagsView().cachedViews;
}
},
methods: {
// 为keep-alive里的component接收的组件包上一层自定义name的壳.
wrap(route, component) {
let wrapper;
// 重点就是这里,这个组件的名字是完全可控的,
// 只要自己写好逻辑,每次能找到对应的外壳组件就行,完全可以写成任何自己想要的名字.
// 这就能配合 keep-alive 的 include 属性可控地操作缓存.
const wrapperName = route.name;
if (this.wrapperMap.has(wrapperName)) {
wrapper = this.wrapperMap.get(wrapperName);
} else {
wrapper = {
name: wrapperName,
render() {
return h('div', { className: 'vaf-page-wrapper' }, component);
}
};
this.wrapperMap.set(wrapperName, wrapper);
}
return h(wrapper);
}
}
});
</script>
<style lang="scss" scoped>
.app-main {
/* 50= navbar 50 */
min-height: calc(100vh - 50px);
width: 100%;
position: relative;
overflow: hidden;
}
.fixed-header+.app-main {
padding-top: 50px;
}
.hasTagsView {
.app-main {
/* 84 = navbar + tags-view = 50 + 34 */
min-height: calc(100vh - 84px);
}
.fixed-header+.app-main {
padding-top: 84px;
}
}
</style>
<style lang="scss">
// fix css style bug in open el-dialog
.el-popup-parent--hidden {
.fixed-header {
padding-right: 15px;
}
}
</style>