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
This commit is contained in:
yujiangping
2025-12-26 10:24:26 +08:00
parent c00e164567
commit 9f647e8357
3 changed files with 32 additions and 6 deletions

View File

@@ -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;
},
}] : []),

View File

@@ -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 ?? '',

View File

@@ -309,9 +309,13 @@ const FolderTree: FC<FolderTreeProps> = ({
const load = async () => {
if (!knowledgeBaseId) {
setTreeData([]);
setExpandedKeys([]); // 重置展开状态
return;
}
try {
// 重置展开状态,确保从根目录开始
setExpandedKeys([]);
const nodes = await buildTreeNodes(knowledgeBaseId, knowledgeBaseId);
if (!cancelled) {
setTreeData(nodes);