From f26cfdc830467f14e05a8a2d0022905aa55bfe61 Mon Sep 17 00:00:00 2001 From: xiaomai Date: Wed, 6 May 2026 16:35:03 +0800 Subject: [PATCH] refactor(frontend): remove top-level await from useAsyncData Transition to non-blocking data fetching to prevent navigation delays. Initial data is now applied via immediate watchers instead of blocking setup. --- frontend/src/views/AncientArtifactList.vue | 30 ++++++++++++++----- frontend/src/views/HabitatDetail.vue | 14 +++++++-- frontend/src/views/HabitatList.vue | 22 +++++++++----- frontend/src/views/ItemDetail.vue | 14 +++++++-- frontend/src/views/ItemsList.vue | 30 ++++++++++++++----- frontend/src/views/PokemonDetail.vue | 16 +++++++--- frontend/src/views/PokemonList.vue | 35 +++++++++++++++++----- frontend/src/views/RecipeDetail.vue | 14 +++++++-- frontend/src/views/RecipeList.vue | 30 ++++++++++++++----- 9 files changed, 153 insertions(+), 52 deletions(-) diff --git a/frontend/src/views/AncientArtifactList.vue b/frontend/src/views/AncientArtifactList.vue index 3984629..af3312a 100644 --- a/frontend/src/views/AncientArtifactList.vue +++ b/frontend/src/views/AncientArtifactList.vue @@ -48,7 +48,7 @@ type AncientArtifactListInitialData = { page: ListPage | null; }; -const { data: initialData } = await useAsyncData( +const { data: initialData } = useAsyncData( `ancient-artifact-list-initial:${locale.value}`, async () => { const [optionsResult, artifactsResult] = await Promise.allSettled([ @@ -68,13 +68,25 @@ const { data: initialData } = await useAsyncData { default: () => ({ options: null, page: null }) } ); -const initialPage = initialData.value?.page ?? null; -options.value = initialData.value?.options ?? null; -artifacts.value = initialPage?.items ?? []; -const initialPageLoaded = ref(initialPage !== null); -loading.value = !initialPageLoaded.value; -nextCursor.value = initialPage?.nextCursor ?? null; -hasMoreArtifacts.value = initialPage?.hasMore ?? false; +const initialPageLoaded = ref(false); + +function applyInitialData(data: AncientArtifactListInitialData | null | undefined) { + if (!data) return; + + if (!options.value && data.options) { + options.value = data.options; + } + + if (initialPageLoaded.value || !data.page) { + return; + } + + artifacts.value = data.page.items; + nextCursor.value = data.page.nextCursor; + hasMoreArtifacts.value = data.page.hasMore; + initialPageLoaded.value = true; + loading.value = false; +} const showEditor = computed(() => route.name === 'ancient-artifact-new'); const canCreateArtifact = computed(() => currentUser.value?.permissions.includes('items.create') === true); @@ -160,6 +172,8 @@ onMounted(async () => { watch(artifactQuery, () => { void loadArtifacts(); }); + +watch(initialData, applyInitialData, { immediate: true });