Files
new-markdown/docs/24-模式切换文本闪烁修复.md

41 lines
2.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# docs/24 源码/即时渲染来回切换文本「有→无→无→有」修复
## 现象(用户真机报回)
空白文档 → 源码模式输入文本 → 切即时渲染:文本在 ✓ → 切回源码:文本没了 ✗
→ 切即时渲染:还是没了 ✗ → 再切源码:又出现了。文本随切换闪烁。
## 根因(无头浏览器按原步骤复现,与报回现象逐拍吻合)
退出源码模式时 `bumpPaneEpoch` 强制富文本窗格重挂:新窗格按状态里的
新文本(源码里输的)初始化 ✓;但**旧窗格卸载时的最终回写**
(onFinalMarkdown → syncEditorContent)随后把旧窗格自己的旧文本写回状态,
盖掉源码文本。此后每次切换,新挂载的一方读状态(已被盖成旧文本),而
卸载的一方又把自己显示的文本写回——于是文本在两个版本间来回翻面:
状态与画面永远差一拍。
审计期已有同类修复(外部重载路径的 suppressFinalWrite 闸门,专防
「卸载回写覆盖」),但退出源码模式这条重挂路径漏加了闸门。
## 修复(App.tsx)
1. **闸门集中进 bumpPaneEpoch**:凡 epoch 重挂(源码退出重建、外部
重载),旧窗格的卸载回写必然过期,重挂前先上闸门丢弃,1.5 秒自清;
外部重载处原有的本地闸门删除,统一走这一处。
2. **源码模式下禁富文本窗格回写**:活动标签处于源码模式时,其隐藏的
富文本窗格的 onMarkdown / onSyncInitial 一律丢弃——它的文本是进源码
前的旧稿,迟到的防抖回写同样会盖掉源码输入。
保活淘汰、关标签等正常卸载不经 epoch 重挂,回写照旧,不受影响。
## 验证
- 无头浏览器按用户原步骤五连切:修复前 step3 ✗ / step4 ✗ / step5 ✓
(与报回完全一致),修复后五步全部 ✓。
- tsc 0 错误;vitest 全量通过;vite 构建通过。
## 待真机复验
- 反复切换源码/即时渲染,文本与光标位置稳定;
- 外部修改文件触发的重载仍正常(闸门合并后回归)。