Skip to content

Commit 430fc84

Browse files
author
jialan
committed
feat: optimize performance
1 parent 8efb103 commit 430fc84

File tree

1 file changed

+34
-37
lines changed

1 file changed

+34
-37
lines changed

website/src/extensions/workbench/treeVisualizerPanel.tsx

Lines changed: 34 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
import { memo, useCallback, useEffect, useState } from 'react';
1+
import { memo, useCallback, useEffect, useState, useTransition } from 'react';
22
import {
33
ReactFlow,
44
Node,
55
Edge,
66
useNodesState,
77
useEdgesState,
88
Position,
9-
useReactFlow,
109
ConnectionMode,
1110
Background,
1211
BackgroundVariant,
@@ -88,7 +87,6 @@ const getNodeStyle = ({
8887
};
8988
};
9089

91-
// 边的样式
9290
const edgeStyle = {
9391
stroke: '#4a90e2',
9492
strokeWidth: 2
@@ -148,37 +146,34 @@ const TreeVisualizerContent = ({ parseTree }: TreeVisualizerPanelProps) => {
148146
const [nodes, setNodes, onNodesChange] = useNodesState<Node<NodeData>>([]);
149147
const [edges, setEdges, onEdgesChange] = useEdgesState<Edge>([]);
150148
const [selectedNodeId, setSelectedNodeId] = useState<string | null>(null);
151-
const { fitView } = useReactFlow();
149+
const [_, startTransition] = useTransition();
152150

153151
// 获取节点的所有子节点ID
154-
const getChildNodeIds = useCallback(
155-
(nodeId: string | null): string[] => {
156-
if (!nodeId) return [];
157-
const childIds: string[] = [];
158-
const queue = [nodeId];
159-
160-
while (queue.length > 0) {
161-
const currentId = queue.shift()!;
162-
edges.forEach((edge) => {
163-
if (edge.source === currentId) {
164-
childIds.push(edge.target);
165-
queue.push(edge.target);
166-
}
167-
});
168-
}
152+
const getChildNodeIds = (nodeId: string | null): string[] => {
153+
if (!nodeId) return [];
154+
const childIds: string[] = [];
155+
const queue = [nodeId];
156+
157+
while (queue.length > 0) {
158+
const currentId = queue.shift()!;
159+
edges.forEach((edge) => {
160+
if (edge.source === currentId) {
161+
childIds.push(edge.target);
162+
queue.push(edge.target);
163+
}
164+
});
165+
}
169166

170-
return childIds;
171-
},
172-
[edges]
173-
);
167+
return childIds;
168+
};
174169

175-
const handleNodeClick = useCallback((event: React.MouseEvent, node: Node) => {
170+
const handleNodeClick = (_event: React.MouseEvent, node: Node) => {
176171
setSelectedNodeId(node.id);
177-
}, []);
172+
};
178173

179-
const handlePaneClick = useCallback(() => {
174+
const handlePaneClick = () => {
180175
setSelectedNodeId(null);
181-
}, []);
176+
};
182177

183178
const convertTreeToElements = useCallback((tree: SerializedTreeNode) => {
184179
const newNodes: Node<NodeData>[] = [];
@@ -245,19 +240,20 @@ const TreeVisualizerContent = ({ parseTree }: TreeVisualizerPanelProps) => {
245240
}, []);
246241

247242
useEffect(() => {
248-
if (!parseTree) return;
243+
if (!parseTree) {
244+
setEdges([]);
245+
setNodes([]);
246+
return;
247+
}
249248

250249
const elements = convertTreeToElements(parseTree);
251250
const layoutedElements = getLayoutedElements(elements.nodes, elements.edges);
252251

253-
setNodes(layoutedElements.nodes);
254-
setEdges(layoutedElements.edges);
255-
setSelectedNodeId(elements.rootNodeId);
256-
257-
// 等待节点渲染完成后自动适应视图
258-
setTimeout(() => {
259-
fitView({ padding: 0.2, includeHiddenNodes: false });
260-
}, 100);
252+
startTransition(() => {
253+
setNodes(layoutedElements.nodes);
254+
setEdges(layoutedElements.edges);
255+
setSelectedNodeId(null);
256+
});
261257
}, [parseTree]);
262258

263259
useEffect(() => {
@@ -275,7 +271,7 @@ const TreeVisualizerContent = ({ parseTree }: TreeVisualizerPanelProps) => {
275271
})
276272
}))
277273
);
278-
}, [selectedNodeId, getChildNodeIds]);
274+
}, [selectedNodeId]);
279275

280276
return (
281277
<div style={{ height: '100%', width: '100%' }}>
@@ -288,6 +284,7 @@ const TreeVisualizerContent = ({ parseTree }: TreeVisualizerPanelProps) => {
288284
fitViewOptions={{ padding: 0.2 }}
289285
minZoom={0.1}
290286
maxZoom={2}
287+
onlyRenderVisibleElements
291288
onNodeClick={handleNodeClick}
292289
onPaneClick={handlePaneClick}
293290
defaultEdgeOptions={{

0 commit comments

Comments
 (0)