From 07291abcf7ceb851f78a1a1a61aa5b25697879c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E4=B8=81?= Date: Thu, 16 Apr 2026 00:08:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E5=A4=9A=E6=AC=A1=E8=AF=B7=E6=B1=82=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=E5=8A=A0=E5=85=A5=E9=98=B2=E6=8A=96=E6=9C=BA?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/Home.vue | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/views/Home.vue b/src/views/Home.vue index 2f7484e..79631db 100644 --- a/src/views/Home.vue +++ b/src/views/Home.vue @@ -216,7 +216,7 @@ const props = withDefaults( { initialSearchExpanded: false }, ) -defineOptions({ name: 'Home' }) +defineOptions({ name: 'HomePage' }) import { ref, onMounted, @@ -320,24 +320,6 @@ function filterVisible(nodes: CategoryTreeNode[] | undefined): CategoryTreeNode[ return nodes.filter((n) => n.forceShow !== false && !n.forceHide) } -/** 第三层区块标题:取当前选中的第一层节点的 sectionTitle 或 label */ -const selectedLayer0SectionTitle = computed(() => { - const root = filterVisible(categoryTree.value) - const id = layerActiveValues.value[0] - const node = id ? root.find((n) => n.id === id) : root[0] - return node?.sectionTitle ?? node?.label ?? '' -}) - -/** 从树中递归查找节点 */ -function findNodeById(nodes: CategoryTreeNode[], id: string): CategoryTreeNode | undefined { - for (const n of nodes) { - if (n.id === id) return n - const found = n.children ? findNodeById(n.children, id) : undefined - if (found) return found - } - return undefined -} - /** 当前选中分类的 tagIds:收集所有选中层级节点的 tagId 数组(含父级),用于事件筛选 */ const activeTagIds = computed(() => { const activeIds = layerActiveValues.value @@ -384,6 +366,14 @@ const categoryLayers = computed(() => { /** 分类选中时:若有 children 则展开下一层并默认选中第一个,并重新加载列表 */ function onCategorySelect(layerIndex: number, selectedId: string) { + if (!selectedId || layerActiveValues.value[layerIndex] === selectedId) { + return + } + + if (categorySelectTimer) { + clearTimeout(categorySelectTimer) + } + const nextValues = [...layerActiveValues.value] nextValues[layerIndex] = selectedId nextValues.length = layerIndex + 1 @@ -401,7 +391,11 @@ function onCategorySelect(layerIndex: number, selectedId: string) { clearEventListCache() eventPage.value = 1 - loadEvents(1, false) + + categorySelectTimer = setTimeout(() => { + categorySelectTimer = null + loadEvents(1, false) + }, 100) } /** 初始化分类选中:默认选中第一个,若有 children 则递归展开 */ @@ -424,6 +418,9 @@ function initCategorySelection() { const PAGE_SIZE = 10 +/** 分类切换时的防抖状态,防止重复请求 */ +let categorySelectTimer: ReturnType | null = null + /** 接口返回的列表(已映射为卡片所需结构) */ const eventList = ref([]) /** 当前页码(从 1 开始) */ @@ -613,6 +610,7 @@ async function loadEvents(page: number, append: boolean, keyword?: string) { pageSize: eventPageSize.value, }) } catch (e) { + console.log(e) if (!append) eventList.value = [] } finally { if (!append) eventListLoading.value = false