From 9d1bb191fb867b038cc2b364560854a55fec2f80 Mon Sep 17 00:00:00 2001 From: digua Date: Sun, 12 Jul 2026 01:00:50 +0800 Subject: [PATCH] perf(settings): virtualize data management sessions --- .../common/Settings/BatchManageTab.vue | 199 ++++++++++-------- 1 file changed, 115 insertions(+), 84 deletions(-) diff --git a/src/components/common/Settings/BatchManageTab.vue b/src/components/common/Settings/BatchManageTab.vue index 41ddad51..51fdef97 100644 --- a/src/components/common/Settings/BatchManageTab.vue +++ b/src/components/common/Settings/BatchManageTab.vue @@ -2,6 +2,7 @@ import { ref, computed, onMounted, watch } from 'vue' import { useI18n } from 'vue-i18n' import { storeToRefs } from 'pinia' +import { useVirtualizer } from '@tanstack/vue-virtual' import { useToast } from '@/composables/useToast' import { useSessionStore } from '@/stores/session' import type { AnalysisSession } from '@/types/base' @@ -12,6 +13,7 @@ import 'dayjs/locale/zh-cn' dayjs.extend(relativeTime) const toast = useToast() +const SESSION_ROW_HEIGHT = 48 const { t, locale } = useI18n() const sessionStore = useSessionStore() @@ -180,6 +182,24 @@ const sortedSessions = computed(() => { return items }) +const listScrollRef = ref(null) +const sessionVirtualizer = useVirtualizer( + computed(() => ({ + count: sortedSessions.value.length, + getScrollElement: () => listScrollRef.value, + estimateSize: () => SESSION_ROW_HEIGHT, + overscan: 10, + getItemKey: (index: number) => sortedSessions.value[index]?.id ?? index, + })) +) +const virtualSessionRows = computed(() => + sessionVirtualizer.value.getVirtualItems().map((virtualItem) => ({ + virtualItem, + session: sortedSessions.value[virtualItem.index]!, + })) +) +const virtualListHeight = computed(() => sessionVirtualizer.value.getTotalSize()) + // 选中的会话 ID 集合 const selectedIds = ref>(new Set()) @@ -589,10 +609,13 @@ onMounted(() => { -
+