AppMain.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <template>
  2. <div class="app-main" :class="{ 'show-tag-view': settings.showTagsView }">
  3. <router-view v-slot="{ Component }">
  4. <!--has transition Judging by settings.mainNeedAnimation-->
  5. <transition v-if="settings.mainNeedAnimation" name="fade-transform" mode="out-in">
  6. <keep-alive :include="cachedViews">
  7. <component :is="Component" :key="key" />
  8. </keep-alive>
  9. </transition>
  10. <!-- no transition -->
  11. <keep-alive v-else :include="cachedViews">
  12. <component :is="Component" :key="key" />
  13. </keep-alive>
  14. </router-view>
  15. </div>
  16. </template>
  17. <script setup lang="ts">
  18. import { ObjTy } from '~/common'
  19. import { useAppStore } from '@/store/app'
  20. const route = useRoute()
  21. const settings = computed(() => {
  22. return appStore.settings
  23. })
  24. const key = computed(() => route.path)
  25. const cachedViews = computed(() => {
  26. return appStore.cachedViews
  27. })
  28. /*listen the component name changing, then to keep-alive the page*/
  29. // cachePage: is true, keep-alive this Page
  30. // leaveRmCachePage: is true, keep-alive remote when page leave
  31. let oldRoute: ObjTy = {}
  32. let deepOldRouter: ObjTy | null = null
  33. const appStore = useAppStore()
  34. const removeDeepChildren = (deepOldRouter) => {
  35. deepOldRouter.children?.forEach((fItem) => {
  36. appStore.M_DEL_CACHED_VIEW_DEEP(fItem.name)
  37. })
  38. }
  39. watch(
  40. () => route.name,
  41. () => {
  42. const routerLevel = route.matched.length
  43. //二级路由处理
  44. if (routerLevel === 2) {
  45. if (deepOldRouter?.name) {
  46. if (deepOldRouter.meta?.leaveRmCachePage && deepOldRouter.meta?.cachePage) {
  47. appStore.M_DEL_CACHED_VIEW(deepOldRouter.name)
  48. //remove the deepOldRouter‘s children component
  49. removeDeepChildren(deepOldRouter)
  50. }
  51. } else {
  52. if (oldRoute?.name) {
  53. if (oldRoute.meta?.leaveRmCachePage && oldRoute.meta?.cachePage) {
  54. appStore.M_DEL_CACHED_VIEW(oldRoute.name)
  55. }
  56. }
  57. }
  58. if (route.name) {
  59. if (route.meta?.cachePage) {
  60. appStore.M_ADD_CACHED_VIEW(route.name)
  61. }
  62. }
  63. deepOldRouter = null
  64. }
  65. //三级路由处理
  66. if (routerLevel === 3) {
  67. //三级时存储当前路由对象的上一级
  68. const parentRoute = route.matched[1]
  69. //deepOldRouter不为空,且deepOldRouter不是当前路由的父对象,则需要清除deepOldRouter缓存
  70. //一般为三级路由跳转三级路由的情况
  71. if (deepOldRouter?.name && deepOldRouter.name !== parentRoute.name) {
  72. if (deepOldRouter.meta?.leaveRmCachePage && deepOldRouter.meta?.cachePage) {
  73. appStore.M_DEL_CACHED_VIEW(deepOldRouter.name)
  74. //remove the deepOldRouter‘s children component
  75. removeDeepChildren(deepOldRouter)
  76. }
  77. } else {
  78. //否则走正常两级路由处理流程
  79. if (oldRoute?.name) {
  80. if (oldRoute.meta?.leaveRmCachePage && oldRoute.meta?.cachePage) {
  81. appStore.M_DEL_CACHED_VIEW_DEEP(oldRoute.name)
  82. }
  83. }
  84. }
  85. //取的是第二级的name
  86. if (parentRoute.name && parentRoute.meta?.cachePage) {
  87. deepOldRouter = parentRoute
  88. appStore.M_ADD_CACHED_VIEW(deepOldRouter.name)
  89. if (route.name) {
  90. if (route.meta?.cachePage) {
  91. //和第三级的name进行缓存
  92. appStore.M_ADD_CACHED_VIEW_DEEP(route.name)
  93. }
  94. }
  95. }
  96. }
  97. oldRoute = JSON.parse(JSON.stringify({ name: route.name, meta: route.meta }))
  98. },
  99. { immediate: true }
  100. )
  101. </script>
  102. <style scoped lang="scss">
  103. .app-main {
  104. padding: var(--app-main-padding);
  105. /*50 = navbar */
  106. position: relative;
  107. overflow: hidden;
  108. background-color: #dfe3ea;
  109. }
  110. .show-tag-view {
  111. height: calc(100vh - #{var(--nav-bar-height)} - #{var(--tag-view-height)}) !important;
  112. }
  113. .fixed-header + .app-main {
  114. padding-top: 50px;
  115. }
  116. </style>