From 9f647e8357c778aefe72b990b5660ceb63e7ad53 Mon Sep 17 00:00:00 2001 From: yujiangping Date: Fri, 26 Dec 2025 10:24:26 +0800 Subject: [PATCH] fix(knowledgeBase): improve navigation and folder tree refresh logic - Add path comparison check in breadcrumb navigation to avoid unnecessary route changes when already on target page - Implement delayed folder tree refresh with setTimeout to ensure state reset completes before refreshing - Add manual table refresh trigger to ensure data updates after navigation - Reset expanded keys in FolderTree component during load to ensure consistent state from root directory - Add expanded keys reset in breadcrumb navigation to prevent stale expansion state - Improve navigation state handling by using replace flag only when on target path to reduce history stack pollution --- web/src/hooks/useBreadcrumbManager.ts | 21 +++++++++++++++---- .../[knowledgeBaseId]/Private.tsx | 13 ++++++++++-- .../KnowledgeBase/components/FolderTree.tsx | 4 ++++ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/web/src/hooks/useBreadcrumbManager.ts b/web/src/hooks/useBreadcrumbManager.ts index a0fafc85..54095925 100644 --- a/web/src/hooks/useBreadcrumbManager.ts +++ b/web/src/hooks/useBreadcrumbManager.ts @@ -213,10 +213,23 @@ export const useBreadcrumbManager = (options?: BreadcrumbOptions) => { refresh: true, // 添加刷新标志 timestamp: Date.now(), // 添加时间戳确保状态变化 }; - navigate(`/knowledge-base/${breadcrumbPath.knowledgeBase!.id}/private`, { - state: navigationState, - replace: true // 使用 replace 避免历史记录堆积 - }); + + // 使用当前页面路径进行导航,避免不必要的路由变化 + const currentPath = window.location.pathname; + const targetPath = `/knowledge-base/${breadcrumbPath.knowledgeBase!.id}/private`; + + if (currentPath === targetPath) { + // 如果已经在目标页面,直接更新状态而不导航 + navigate(targetPath, { + state: navigationState, + replace: true // 使用 replace 避免历史记录堆积 + }); + } else { + // 如果不在目标页面,正常导航 + navigate(targetPath, { + state: navigationState + }); + } return false; }, }] : []), diff --git a/web/src/views/KnowledgeBase/[knowledgeBaseId]/Private.tsx b/web/src/views/KnowledgeBase/[knowledgeBaseId]/Private.tsx index 5a4492d9..01e20aa1 100644 --- a/web/src/views/KnowledgeBase/[knowledgeBaseId]/Private.tsx +++ b/web/src/views/KnowledgeBase/[knowledgeBaseId]/Private.tsx @@ -210,8 +210,15 @@ const Private: FC = () => { // 清除自动展开路径 setAutoExpandPath([]); - // 刷新文件夹树(简单的刷新,不需要复杂的重置逻辑) - setFolderTreeRefreshKey((prev) => prev + 1); + // 刷新文件夹树 - 使用延迟确保状态重置完成后再刷新 + setTimeout(() => { + setFolderTreeRefreshKey((prev) => prev + 1); + }, 100); + + // 手动触发表格刷新,确保数据更新 + setTimeout(() => { + tableRef.current?.loadData(); + }, 200); // 清除 state,避免重复处理 navigate(location.pathname, { replace: true, state: {} }); @@ -584,6 +591,8 @@ const Private: FC = () => { await new Promise(resolve => setTimeout(resolve, 300)); // 然后刷新文件夹树 setFolderTreeRefreshKey((prev) => prev + 1); + + // 确保 folder 状态正确设置 if (!folder) { setFolder({ kb_id: knowledgeBaseId ?? '', diff --git a/web/src/views/KnowledgeBase/components/FolderTree.tsx b/web/src/views/KnowledgeBase/components/FolderTree.tsx index 299e4cf3..8455f8b9 100644 --- a/web/src/views/KnowledgeBase/components/FolderTree.tsx +++ b/web/src/views/KnowledgeBase/components/FolderTree.tsx @@ -309,9 +309,13 @@ const FolderTree: FC = ({ const load = async () => { if (!knowledgeBaseId) { setTreeData([]); + setExpandedKeys([]); // 重置展开状态 return; } try { + // 重置展开状态,确保从根目录开始 + setExpandedKeys([]); + const nodes = await buildTreeNodes(knowledgeBaseId, knowledgeBaseId); if (!cancelled) { setTreeData(nodes);