From 873bf905ab699769f10fe2abe1a7cd1235477072 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Sat, 5 Jul 2025 12:13:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=8A=A8=E6=80=81=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E9=A1=B5=E6=B3=A8=E5=86=8C=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scss/template/placeholders/_misc.scss | 10 +- src/@layouts/components/VerticalNavLayout.vue | 26 +- src/components/FileBrowser.vue | 4 +- src/composables/useDynamicHeaderTab.ts | 51 ++- src/layouts/components/DefaultLayout.vue | 46 ++- src/layouts/components/HeaderTab.vue | 2 - src/pages/downloading.vue | 23 +- src/pages/recommend.vue | 87 +++-- src/pages/setting.vue | 21 +- src/views/plugin/PluginCardListView.vue | 342 +++++++++--------- src/views/reorganize/TransferHistoryView.vue | 2 +- 11 files changed, 358 insertions(+), 256 deletions(-) diff --git a/src/@core/scss/template/placeholders/_misc.scss b/src/@core/scss/template/placeholders/_misc.scss index 2bc7531e..f7af90c0 100644 --- a/src/@core/scss/template/placeholders/_misc.scss +++ b/src/@core/scss/template/placeholders/_misc.scss @@ -9,7 +9,7 @@ // 磨砂渐变效果 backdrop-filter: blur(20px); - block-size: calc(env(safe-area-inset-top, 0px) + 5rem); + block-size: calc(env(safe-area-inset-top, 0px) + var(--navbar-height) + 5rem); content: ""; inset-block-start: 0; inset-inline: 0; @@ -18,10 +18,10 @@ mask: linear-gradient( to bottom, rgba(0, 0, 0, 100%) 0%, - rgba(0, 0, 0, 90%) calc(env(safe-area-inset-top, 0px) + 1rem), - rgba(0, 0, 0, 70%) calc(env(safe-area-inset-top, 0px) + 2rem), - rgba(0, 0, 0, 50%) calc(env(safe-area-inset-top, 0px) + 3rem), - rgba(0, 0, 0, 20%) calc(env(safe-area-inset-top, 0px) + 4rem), + rgba(0, 0, 0, 90%) calc(env(safe-area-inset-top, 0px) + var(--navbar-height) + 1rem), + rgba(0, 0, 0, 70%) calc(env(safe-area-inset-top, 0px) + var(--navbar-height) + 2rem), + rgba(0, 0, 0, 50%) calc(env(safe-area-inset-top, 0px) + var(--navbar-height) + 3rem), + rgba(0, 0, 0, 20%) calc(env(safe-area-inset-top, 0px) + var(--navbar-height) + 4rem), rgba(0, 0, 0, 0%) 100% ); pointer-events: none; diff --git a/src/@layouts/components/VerticalNavLayout.vue b/src/@layouts/components/VerticalNavLayout.vue index 1335ecbb..602cb5fd 100644 --- a/src/@layouts/components/VerticalNavLayout.vue +++ b/src/@layouts/components/VerticalNavLayout.vue @@ -38,15 +38,23 @@ export default defineComponent({ ) // 👉 Navbar - const navbar = h('header', { class: ['layout-navbar navbar-blur'] }, [ - h( - 'div', - { class: 'navbar-content-container' }, - slots.navbar?.({ - toggleVerticalOverlayNavActive: toggleIsOverlayNavActive, - }), - ), - ]) + const navbar = h( + 'header', + { class: ['layout-navbar navbar-blur'] }, + [ + h( + 'div', + { class: 'navbar-content-container' }, + slots.navbar?.({ + toggleVerticalOverlayNavActive: toggleIsOverlayNavActive, + }), + ), + // 👉 Dynamic Header Tab in NavBar + slots['dynamic-header-tab']?.() + ? h('div', { class: 'layout-dynamic-header-tab' }, slots['dynamic-header-tab']?.()) + : null, + ].filter(Boolean), + ) const main = h( 'main', diff --git a/src/components/FileBrowser.vue b/src/components/FileBrowser.vue index 62d67cdd..f7992fb8 100644 --- a/src/components/FileBrowser.vue +++ b/src/components/FileBrowser.vue @@ -243,14 +243,14 @@ function stopDrag() { // 外层DIV大小控制 const scrollStyle = computed(() => { - return appMode + return appMode.value ? 'height: calc(100vh - 10.5rem - env(safe-area-inset-bottom) - 7rem)' : 'height: calc(100vh - 10.5rem - env(safe-area-inset-bottom)' }) // 文件列表大小限制 const fileListStyle = computed(() => { - return appMode + return appMode.value ? 'height: calc(100vh - 14rem - env(safe-area-inset-bottom) - 7rem)' : 'height: calc(100vh - 14rem - env(safe-area-inset-bottom)' }) diff --git a/src/composables/useDynamicHeaderTab.ts b/src/composables/useDynamicHeaderTab.ts index 2cc48156..7d5c5763 100644 --- a/src/composables/useDynamicHeaderTab.ts +++ b/src/composables/useDynamicHeaderTab.ts @@ -62,23 +62,50 @@ export function useDynamicHeaderTab() { } }) - // 在组件卸载时取消注册 - onUnmounted(() => { + // 注册函数 + const doRegister = () => { + // 确保路由路径是最新的 + tabConfig.routePath = route.path + + if (registerDynamicHeaderTab) { + registerDynamicHeaderTab(tabConfig) + } else if (typeof window !== 'undefined') { + // 使用全局方法作为备用 + const globalRegister = (window as any).__VUE_INJECT_DYNAMIC_HEADER_TAB__ + if (globalRegister) { + globalRegister(tabConfig) + } + } + } + + // 取消注册函数 + const doUnregister = () => { if (unregisterDynamicHeaderTab) { unregisterDynamicHeaderTab() } + } + + // 初始注册(延迟到下个tick,确保路由已经完全切换) + nextTick(() => { + doRegister() }) - // 初始注册 - if (registerDynamicHeaderTab) { - registerDynamicHeaderTab(tabConfig) - } else if (typeof window !== 'undefined') { - // 使用全局方法作为备用 - const globalRegister = (window as any).__VUE_INJECT_DYNAMIC_HEADER_TAB__ - if (globalRegister) { - globalRegister(tabConfig) - } - } + // 处理页面激活时重新注册(支持keep-alive缓存的页面) + onActivated(() => { + nextTick(() => { + doRegister() + }) + }) + + // 处理页面失活时取消注册(支持keep-alive缓存的页面) + onDeactivated(() => { + doUnregister() + }) + + // 在组件卸载时取消注册 + onUnmounted(() => { + doUnregister() + }) } // 取消注册 diff --git a/src/layouts/components/DefaultLayout.vue b/src/layouts/components/DefaultLayout.vue index 281994e9..ee088570 100644 --- a/src/layouts/components/DefaultLayout.vue +++ b/src/layouts/components/DefaultLayout.vue @@ -91,7 +91,8 @@ const dynamicHeaderTab = ref(null) const registerDynamicHeaderTab = (tab: DynamicHeaderTab) => { // 保存注册标签页的路由路径 tab.routePath = route.path - dynamicHeaderTab.value = tab + // 强制更新,确保响应式系统能检测到变化 + dynamicHeaderTab.value = { ...tab } } // 提供一个方法让其他组件取消注册动态标签页 @@ -123,11 +124,17 @@ provide('unregisterDynamicHeaderTab', unregisterDynamicHeaderTab) // 监听路由变化来清除动态标签页 watch( () => route.path, - newPath => { - // 当路由变化时,清除动态标签页(如果不是同一个路由注册的) - if (dynamicHeaderTab.value && dynamicHeaderTab.value.routePath !== newPath) { - dynamicHeaderTab.value = null - } + (newPath, oldPath) => { + // 使用nextTick确保新页面的组件已经挂载完成 + nextTick(() => { + // 延迟一小段时间,让新页面有机会注册标签页 + setTimeout(() => { + // 如果当前标签页不属于新路由,则清除 + if (dynamicHeaderTab.value && dynamicHeaderTab.value.routePath !== route.path) { + dynamicHeaderTab.value = null + } + }, 50) // 减少延迟时间,但仍然给新页面注册机会 + }) }, { immediate: false }, ) @@ -138,7 +145,7 @@ const showDynamicHeaderTab = computed(() => { dynamicHeaderTab.value && dynamicHeaderTab.value.items.length > 0 && // 确保只在注册的路由路径下显示标签页 - (!dynamicHeaderTab.value.routePath || dynamicHeaderTab.value.routePath === route.path) + dynamicHeaderTab.value.routePath === route.path ) }) @@ -286,7 +293,7 @@ onMounted(() => { /> - +