编辑器初始化会触发假保存

**富文本/Markdown 编辑器加载一篇笔记时,会把 Markdown 解析成内部结构再序列化回来,过程中「整理格式」(表格空格、分隔线长度、checkbox 写法)——内容语义没变,但字符串变了。如果保存逻辑只看「字符串不同」,就会把「打开」误判成「用户编辑了」,触发一次假保存。**

假保存的连锁后果

打开笔记 → 编辑器 round-trip → 字符串变化 → 误判为用户编辑
  → 发保存请求 → 数据库 updatedAt 变新
  → 列表按 updatedAt 倒序 → 当前卡片被弹到顶部
  → 左侧列表滚动位置跳走(看起来像「滚动记忆失败」)

所以「点开卡片后列表跳位」的根因往往不是滚动记忆,而是假保存改了排序字段。

修法

  1. 忽略初始化那次更新:已有内容的笔记,编辑器初始化时的第一次 Markdown 更新直接丢弃;只有之后真正编辑产生的更新才保存。空笔记仍保留第一次真实输入保存,避免新建丢内容。
  2. 当前正在查看/编辑的项不因自动保存即时重排:列表默认仍按 updatedAt 排序,但被选中的卡片不立刻弹到顶部,等离开、切换区、刷新列表时再重排。这样既保留「最近编辑在上面」,又不跳动。
  3. 更彻底的方向是让左侧列表根本不重建(见 master-detail),而不是「滚走后再恢复」。

相关

  • 判据要用真值而非代理 —— 「字符串 diff」是「用户是否编辑」的代理,只在格式整理处分叉
  • 列表切换要用master-detail而非重建列表 —— 让左侧列表根本不重建,比「滚走后再恢复」更彻底
  • 讲bug先讲现象再讲根因