From 9355fa7e938d0339ebc276d867406ce43b0f8b45 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Mon, 11 May 2026 02:16:36 +0800 Subject: [PATCH] =?UTF-8?q?fix(sidebar):=20=E4=BF=AE=E5=A4=8D=E4=BE=A7?= =?UTF-8?q?=E8=BE=B9=E6=A0=8F=E6=A0=91=E7=8A=B6=E6=80=81=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/layout/AppSidebar.vue | 2 +- src/components/sidebar/ConnectionTree.vue | 69 +++++++++++---------- src/components/sidebar/TreeItem.vue | 74 ++++------------------- src/composables/useFlatTree.ts | 27 +++++++++ src/lib/sidebarTreeItemLayout.ts | 28 +++++++++ tests/sidebarTreeItemLayout.test.ts | 33 ++++++++++ tests/useFlatTree.test.ts | 42 +++++++++++++ 7 files changed, 180 insertions(+), 95 deletions(-) create mode 100644 src/composables/useFlatTree.ts create mode 100644 src/lib/sidebarTreeItemLayout.ts create mode 100644 tests/sidebarTreeItemLayout.test.ts create mode 100644 tests/useFlatTree.test.ts diff --git a/src/components/layout/AppSidebar.vue b/src/components/layout/AppSidebar.vue index 8383f83754..0cbff9faa8 100644 --- a/src/components/layout/AppSidebar.vue +++ b/src/components/layout/AppSidebar.vue @@ -85,7 +85,7 @@ async function refreshTree() { {{ t("sidebar.export") }} -
+
diff --git a/src/components/sidebar/ConnectionTree.vue b/src/components/sidebar/ConnectionTree.vue index 7dc5d5fb3d..350f1d5399 100644 --- a/src/components/sidebar/ConnectionTree.vue +++ b/src/components/sidebar/ConnectionTree.vue @@ -5,8 +5,11 @@ import { Search, X, ListFilter, Check, FolderPlus } from "lucide-vue-next"; import { useConnectionStore } from "@/stores/connectionStore"; import type { TreeNode } from "@/types/database"; import { matchSidebarLabel } from "@/lib/sidebarSearch"; +import { flattenTree, shouldVirtualizeFlatTree, type FlatTreeNode } from "@/composables/useFlatTree"; import TreeItem from "./TreeItem.vue"; import DatabaseIcon from "@/components/icons/DatabaseIcon.vue"; +import { RecycleScroller } from "vue-virtual-scroller"; +import "vue-virtual-scroller/dist/vue-virtual-scroller.css"; import { DropdownMenu, DropdownMenuTrigger, @@ -145,22 +148,8 @@ const filteredNodes = computed(() => { return nodes; }); -const TOP_LEVEL_PAGE_SIZE = 50; -const topLevelDisplayLimit = ref(TOP_LEVEL_PAGE_SIZE); - -const visibleFilteredNodes = computed(() => filteredNodes.value.slice(0, topLevelDisplayLimit.value)); - -const hasMoreTopLevel = computed(() => filteredNodes.value.length > topLevelDisplayLimit.value); - -const remainingTopLevelCount = computed(() => filteredNodes.value.length - topLevelDisplayLimit.value); - -function showMoreTopLevel() { - topLevelDisplayLimit.value += TOP_LEVEL_PAGE_SIZE; -} - -watch(filteredNodes, () => { - topLevelDisplayLimit.value = TOP_LEVEL_PAGE_SIZE; -}); +const flatNodes = computed(() => flattenTree(filteredNodes.value)); +const useVirtualTree = computed(() => shouldVirtualizeFlatTree(flatNodes.value.length)); const pendingRenameGroupId = ref(null); @@ -179,7 +168,7 @@ function onSearchToggle(node: TreeNode) {