2026-04-16-18-51-06 - 修复路由切换后视频分析图片丢失问题

This commit is contained in:
2026-04-16 18:58:35 +08:00
parent 11278d0bcd
commit 396a8cab0b
6 changed files with 452 additions and 16 deletions

View File

@@ -83,3 +83,25 @@
- 对于图片/截图类卡片上的操作按钮,应优先考虑不遮挡核心图片内容的区域(如底部、角落),避免影响预览。
- 在 UI 微调过程中,可以通过小步迭代快速验证用户意图,减少一次性大改导致的方向偏差。
- 实体按钮比纯文字链接具有更高的可点击性和辨识度,在微小空间中也能提供良好的交互体验。
---
## 记录 5路由切换后视频分析图片丢失
**A. 具体问题**
`/report-editor` 中上传视频、自动摘取关键帧、手动截图或拖拽截图到 `image-placeholder` 后,切换到 `/report-manage` 等其他页面再返回 `/report-editor`,右侧「视频分析」面板中的所有截图和关键帧全部消失;编辑器中已拖拽到 placeholder 的图片也不可见。
**B. 产生问题原因**
1. `ReportEditor.tsx` 在组件卸载时通过 `stateRef.current` 保存草稿到 `localStorage`
2. 初始化 `useEffect``useLayoutEffect` 从 draft 或已保存报告恢复数据时,仅通过 `setState` 更新了 React state`videos``capturedFrames`),但 **没有同步更新 `stateRef.current`**
3. 用户首次进入页面时数据正确显示;离开页面时,`stateRef.current` 仍保存着初始值(空数组),导致 `saveDraftToStorage()` 用空数组覆盖了 localStorage 中的 draft。
4. 再次返回页面时,系统优先读取被污染后的 draft从而丢失了所有视频分析数据。
**C. 解决问题方案**
`ReportEditor.tsx` 的 6 个数据恢复入口(初始化 `useEffect` 的 3 个分支 + `useLayoutEffect` 安全网的 3 个分支)中,恢复 `reportData``videos``capturedFrames` 后立即同步赋值给 `stateRef.current`,确保后续草稿保存时数据完整。
**D. 后续如何避免问题**
- 当使用 `useRef` 作为「自动保存」的数据快照时,**任何从持久化存储恢复数据到 React state 的操作,必须同步更新对应的 ref**,否则 ref 将始终保存陈旧值。
- 在涉及草稿/自动保存的功能中,应定期审查所有数据恢复路径(初始化 effect、安全网 effect、手动导入等确保 ref 与 state 的一致性。
- 对于复杂单文件组件,可考虑将「持久化 ↔ 状态同步」逻辑抽离为统一的数据恢复函数,集中处理 ref 同步,减少遗漏点。