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

2.1 KiB
Raw Permalink Blame History

docs/24 源码/即时渲染来回切换文本「有→无→无→有」修复

现象(用户真机报回)

空白文档 → 源码模式输入文本 → 切即时渲染:文本在 ✓ → 切回源码:文本没了 ✗ → 切即时渲染:还是没了 ✗ → 再切源码:又出现了。文本随切换闪烁。

根因(无头浏览器按原步骤复现,与报回现象逐拍吻合)

退出源码模式时 bumpPaneEpoch 强制富文本窗格重挂:新窗格按状态里的 新文本(源码里输的)初始化 ✓;但旧窗格卸载时的最终回写 (onFinalMarkdown → syncEditorContent)随后把旧窗格自己的旧文本写回状态, 盖掉源码文本。此后每次切换,新挂载的一方读状态(已被盖成旧文本),而 卸载的一方又把自己显示的文本写回——于是文本在两个版本间来回翻面: 状态与画面永远差一拍。

审计期已有同类修复(外部重载路径的 suppressFinalWrite 闸门,专防 「卸载回写覆盖」),但退出源码模式这条重挂路径漏加了闸门。

修复(App.tsx)

  1. 闸门集中进 bumpPaneEpoch:凡 epoch 重挂(源码退出重建、外部 重载),旧窗格的卸载回写必然过期,重挂前先上闸门丢弃,1.5 秒自清; 外部重载处原有的本地闸门删除,统一走这一处。
  2. 源码模式下禁富文本窗格回写:活动标签处于源码模式时,其隐藏的 富文本窗格的 onMarkdown / onSyncInitial 一律丢弃——它的文本是进源码 前的旧稿,迟到的防抖回写同样会盖掉源码输入。

保活淘汰、关标签等正常卸载不经 epoch 重挂,回写照旧,不受影响。

验证

  • 无头浏览器按用户原步骤五连切:修复前 step3 ✗ / step4 ✗ / step5 ✓ (与报回完全一致),修复后五步全部 ✓。
  • tsc 0 错误;vitest 全量通过;vite 构建通过。

待真机复验

  • 反复切换源码/即时渲染,文本与光标位置稳定;
  • 外部修改文件触发的重载仍正常(闸门合并后回归)。