fix(components): 修复组件中定时器内存泄漏问题

- 在TopLoadingBar组件中添加timeoutRef并正确清理定时器
- 在Agent页面中添加timeoutRef管理AI响应模拟定时器
- 修复BasicInformation组件中useCallback依赖数组缺失问题
- 在CreateDataset页面中传递hidden属性控制数据源显示
- 在Orchestration页面中添加intervalRef管理工作流执行进度
- 在SynthesisTask中添加testTimeoutRef管理模板测试定时器
- 确保所有组件卸载时正确清除定时器避免内存泄漏
This commit is contained in:
2026-01-30 14:35:45 +08:00
parent 98d2ef1aa5
commit accaa47a83
6 changed files with 76 additions and 10 deletions

View File

@@ -1,4 +1,4 @@
import React, { useState } from "react";
import React, { useState, useRef, useEffect } from "react";
import { Button, Card, Progress, Badge, Tabs } from "antd";
import {
GitBranch,
@@ -272,6 +272,19 @@ export default function OrchestrationPage() {
);
const [showWorkflowEditor, setShowWorkflowEditor] = useState(false);
// 使用 useRef 保存 interval 引用
const intervalRef = useRef<NodeJS.Timeout | null>(null);
// 组件卸载时清理 interval
useEffect(() => {
return () => {
if (intervalRef.current) {
clearInterval(intervalRef.current);
intervalRef.current = null;
}
};
}, []);
const startNewFlow = () => {
setShowWorkflowEditor(true);
};
@@ -310,8 +323,14 @@ export default function OrchestrationPage() {
setExecutions([newExecution, ...executions]);
// 清理旧的 interval
if (intervalRef.current) {
clearInterval(intervalRef.current);
intervalRef.current = null;
}
// 模拟执行进度
const interval = setInterval(() => {
intervalRef.current = setInterval(() => {
setExecutions((prev) =>
prev.map((exec) => {
if (exec.id === newExecution.id) {
@@ -319,6 +338,11 @@ export default function OrchestrationPage() {
exec.progress + Math.random() * 10,
100
);
// 进度完成时清理 interval
if (newProgress >= 100 && intervalRef.current) {
clearInterval(intervalRef.current);
intervalRef.current = null;
}
return {
...exec,
progress: newProgress,
@@ -334,8 +358,6 @@ export default function OrchestrationPage() {
})
);
}, 500);
setTimeout(() => clearInterval(interval), 10000);
};
const getStatusIcon = (status: string) => {