You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
3.6 KiB
148 lines
3.6 KiB
<script setup lang="ts">
|
|
import {
|
|
h,
|
|
ref,
|
|
computed,
|
|
Transition,
|
|
defineComponent,
|
|
getCurrentInstance
|
|
} from "vue";
|
|
import { RouterView } from "vue-router";
|
|
import backTop from "/@/assets/svg/back_top.svg";
|
|
import { usePermissionStoreHook } from "/@/store/modules/permission";
|
|
|
|
const props = defineProps({
|
|
fixedHeader: Boolean
|
|
});
|
|
const keepAlive: Boolean = ref(
|
|
getCurrentInstance().appContext.config.globalProperties.$config?.KeepAlive
|
|
);
|
|
const instance =
|
|
getCurrentInstance().appContext.app.config.globalProperties.$storage;
|
|
|
|
const transitions = computed(() => {
|
|
return route => {
|
|
return route.meta.transition;
|
|
};
|
|
});
|
|
|
|
const hideTabs = computed(() => {
|
|
return instance?.sets.hideTabs;
|
|
});
|
|
const layout = computed(() => {
|
|
return instance?.layout.layout === "vertical";
|
|
});
|
|
|
|
const transitionMain = defineComponent({
|
|
render() {
|
|
return h(
|
|
Transition,
|
|
{
|
|
name:
|
|
transitions.value(this.route) &&
|
|
this.route.meta.transition.enterTransition
|
|
? "pure-classes-transition"
|
|
: (transitions.value(this.route) &&
|
|
this.route.meta.transition.name) ||
|
|
"fade-transform",
|
|
enterActiveClass:
|
|
transitions.value(this.route) &&
|
|
`animate__animated ${this.route.meta.transition.enterTransition}`,
|
|
leaveActiveClass:
|
|
transitions.value(this.route) &&
|
|
`animate__animated ${this.route.meta.transition.leaveTransition}`,
|
|
mode: "out-in",
|
|
appear: true
|
|
},
|
|
{
|
|
default: () => [this.$slots.default()]
|
|
}
|
|
);
|
|
},
|
|
props: {
|
|
route: {
|
|
type: undefined,
|
|
required: true
|
|
}
|
|
}
|
|
});
|
|
</script>
|
|
|
|
<template>
|
|
<section
|
|
:class="[props.fixedHeader ? 'app-main' : 'app-main-nofixed-header']"
|
|
:style="[
|
|
hideTabs && layout ? 'padding-top: 48px;' : '',
|
|
!hideTabs && layout ? 'padding-top: 85px;' : '',
|
|
hideTabs && !layout ? 'padding-top: 48px' : '',
|
|
!hideTabs && !layout ? 'padding-top: 98px;' : ''
|
|
]"
|
|
>
|
|
<router-view>
|
|
<template #default="{ Component, route }">
|
|
<el-scrollbar v-if="props.fixedHeader">
|
|
<el-backtop title="回到顶部" target=".app-main .el-scrollbar__wrap">
|
|
<backTop />
|
|
</el-backtop>
|
|
<transitionMain :route="route">
|
|
<keep-alive
|
|
v-if="keepAlive"
|
|
:include="usePermissionStoreHook().cachePageList"
|
|
>
|
|
<component
|
|
:is="Component"
|
|
:key="route.fullPath"
|
|
class="main-content"
|
|
/>
|
|
</keep-alive>
|
|
<component
|
|
v-else
|
|
:is="Component"
|
|
:key="route.fullPath"
|
|
class="main-content"
|
|
/>
|
|
</transitionMain>
|
|
</el-scrollbar>
|
|
<div v-else>
|
|
<transitionMain :route="route">
|
|
<keep-alive
|
|
v-if="keepAlive"
|
|
:include="usePermissionStoreHook().cachePageList"
|
|
>
|
|
<component
|
|
:is="Component"
|
|
:key="route.fullPath"
|
|
class="main-content"
|
|
/>
|
|
</keep-alive>
|
|
<component
|
|
v-else
|
|
:is="Component"
|
|
:key="route.fullPath"
|
|
class="main-content"
|
|
/>
|
|
</transitionMain>
|
|
</div>
|
|
</template>
|
|
</router-view>
|
|
</section>
|
|
</template>
|
|
|
|
<style scoped>
|
|
.app-main {
|
|
width: 100%;
|
|
height: 100vh;
|
|
position: relative;
|
|
overflow-x: hidden;
|
|
}
|
|
|
|
.app-main-nofixed-header {
|
|
width: 100%;
|
|
min-height: 100vh;
|
|
position: relative;
|
|
}
|
|
|
|
.main-content {
|
|
margin: 24px;
|
|
}
|
|
</style>
|