fix(web): ReviewReport flashMark 定时器卸载清理,防泄漏
flashMark 的 setTimeout 句柄入 ref + 卸载 useEffect 清理,重复触发先清旧定时器;提 FLASH_DURATION_MS 常量。闪烁行为不变。
This commit is contained in:
@@ -66,6 +66,9 @@ import { ReviewSummaryRail } from "./ReviewSummaryRail";
|
|||||||
import { StylePanel } from "@/components/style/StylePanel";
|
import { StylePanel } from "@/components/style/StylePanel";
|
||||||
import { RefineView } from "@/components/style/RefineView";
|
import { RefineView } from "@/components/style/RefineView";
|
||||||
|
|
||||||
|
// 命中区闪烁高亮持续时长(朱砂脉冲)。
|
||||||
|
const FLASH_DURATION_MS = 900;
|
||||||
|
|
||||||
interface ReviewReportProps {
|
interface ReviewReportProps {
|
||||||
project: ProjectResponse;
|
project: ProjectResponse;
|
||||||
chapterNo: number;
|
chapterNo: number;
|
||||||
@@ -112,6 +115,16 @@ export function ReviewReport({
|
|||||||
null,
|
null,
|
||||||
);
|
);
|
||||||
const seededRef = useRef(false);
|
const seededRef = useRef(false);
|
||||||
|
// flashMark 的收尾定时器句柄:组件卸载或重复触发时清除,避免定时器泄漏。
|
||||||
|
const flashTimerRef = useRef<number | null>(null);
|
||||||
|
useEffect(
|
||||||
|
() => () => {
|
||||||
|
if (flashTimerRef.current !== null) {
|
||||||
|
window.clearTimeout(flashTimerRef.current);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[],
|
||||||
|
);
|
||||||
|
|
||||||
// 进页一次性把历史留痕(冲突 + 伏笔建议 + 节奏)种入流状态(无需重审即可裁决/查看)。
|
// 进页一次性把历史留痕(冲突 + 伏笔建议 + 节奏)种入流状态(无需重审即可裁决/查看)。
|
||||||
const seededConflicts = useMemo(
|
const seededConflicts = useMemo(
|
||||||
@@ -333,7 +346,13 @@ export function ReviewReport({
|
|||||||
const mark = document.getElementById(`draft-mark-${index}`);
|
const mark = document.getElementById(`draft-mark-${index}`);
|
||||||
if (!mark) return;
|
if (!mark) return;
|
||||||
mark.classList.add("draft-mark-flash");
|
mark.classList.add("draft-mark-flash");
|
||||||
window.setTimeout(() => mark.classList.remove("draft-mark-flash"), 900);
|
if (flashTimerRef.current !== null) {
|
||||||
|
window.clearTimeout(flashTimerRef.current);
|
||||||
|
}
|
||||||
|
flashTimerRef.current = window.setTimeout(() => {
|
||||||
|
mark.classList.remove("draft-mark-flash");
|
||||||
|
flashTimerRef.current = null;
|
||||||
|
}, FLASH_DURATION_MS);
|
||||||
};
|
};
|
||||||
|
|
||||||
// 跳转/锚点:在可编辑正文里定位、选中并滚动到该冲突对应区域 + 闪烁;定位不到则提示手动查找。
|
// 跳转/锚点:在可编辑正文里定位、选中并滚动到该冲突对应区域 + 闪烁;定位不到则提示手动查找。
|
||||||
|
|||||||
Reference in New Issue
Block a user