From 913e0071ddd25d5c9c55fa6338b364df0cb294cf Mon Sep 17 00:00:00 2001 From: Ap_Tx <3045929398@qq.com> Date: Wed, 30 Sep 2026 21:11:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=A6=96=E6=AC=A1?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E5=85=AC=E5=91=8A=E6=9C=AA=E5=BC=B9=E5=87=BA?= =?UTF-8?q?=E5=B9=B6=E6=B7=BB=E5=8A=A0=E4=BE=A7=E6=A0=8F=E5=85=AC=E5=91=8A?= =?UTF-8?q?=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 首次启动公告未弹出,原因有二: - StartupAnnouncementModal 未 defineExpose({ show }),父组件调用 show() 静默失败; - 展示逻辑在调用 show() 之前就写入了 localStorage 的"已读"标记, 一旦 show 失败便永久不再弹出。 修复: - 组件补上 defineExpose({ show }); - 展示逻辑改为"确认能拿到组件实例并 show() 成功后再写标记", 组件尚未挂载时于 nextTick 重试。 同时把首页侧栏的"每日小挑战"替换为可点击的"公告"入口 (HomeAnnouncementEntry),点击通过 provide/inject 的 showStartupAnnouncement 打开公告弹窗。 --- apps/app-frontend/src/App.vue | 23 ++++++++++--- .../components/home/HomeAnnouncementEntry.vue | 32 +++++++++++++++++++ .../ui/StartupAnnouncementModal.vue | 2 ++ apps/app-frontend/src/pages/Index.vue | 4 +-- 4 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 apps/app-frontend/src/components/home/HomeAnnouncementEntry.vue diff --git a/apps/app-frontend/src/App.vue b/apps/app-frontend/src/App.vue index 811870e..bc43254 100644 --- a/apps/app-frontend/src/App.vue +++ b/apps/app-frontend/src/App.vue @@ -63,7 +63,7 @@ import { openUrl } from '@tauri-apps/plugin-opener' import { type as getOsType } from '@tauri-apps/plugin-os' import { saveWindowState, StateFlags } from '@tauri-apps/plugin-window-state' import { hideAllPoppers } from 'floating-vue' -import { computed, onMounted, onUnmounted, provide, ref, watch } from 'vue' +import { computed, nextTick, onMounted, onUnmounted, provide, ref, watch } from 'vue' import { type RouteLocationNormalizedLoaded, RouterView, useRoute, useRouter } from 'vue-router' import InstancePlayerModal from '@/components/instance/InstancePlayerModal.vue' @@ -1271,6 +1271,7 @@ provide( ) provide('previewMinecraftCrashModal', () => minecraftCrashModal.value?.showPreview()) provide('showLauncherPopup', (_request: unknown) => {}) +provide('showStartupAnnouncement', () => startupAnnouncementModal.value?.show()) const stateFailed = ref(false) stateInitialization @@ -1544,13 +1545,27 @@ const startupAnnouncementModal = ref +import { NewspaperIcon, RightArrowIcon } from '@modrinth/assets' +import { inject } from 'vue' + +const showAnnouncement = inject<(() => void) | undefined>('showStartupAnnouncement') + +function open() { + showAnnouncement?.() +} + + + \ No newline at end of file diff --git a/apps/app-frontend/src/components/ui/StartupAnnouncementModal.vue b/apps/app-frontend/src/components/ui/StartupAnnouncementModal.vue index fafad29..8f08924 100644 --- a/apps/app-frontend/src/components/ui/StartupAnnouncementModal.vue +++ b/apps/app-frontend/src/components/ui/StartupAnnouncementModal.vue @@ -30,6 +30,8 @@ function hide() { function openLink(url: string) { void openUrl(url) } + +defineExpose({ show })