fix: 返回列表后未读邮件状态不更新(BFCache 静默同步) #9

Merged
kevin merged 1 commits from dsh/mailgo:fix/unread-status-bfcache into main 2026-08-18 11:18:30 +08:00
Contributor

问题

未读邮件点进去(阅读页自动标记已读)再返回列表,仍显示未读,需要手动刷新。

原因:浏览器从 BFCache(往返缓存)恢复的是旧 DOM,不会重新请求服务器,服务端已更新的已读状态无法反映到列表。

修复

  • 将三个列表页(inbox/drafts/sent)的交互脚本提取为公共模板 listjs(base.html),消除三份重复
  • 监听 pageshow(persisted=true)(BFCache 恢复的标准事件):静默 fetch 当前列表页,局部更新行状态——未读类/蓝点、已删除行移除、侧栏未读角标、共 N 封计数;不整页刷新,保留滚动位置与搜索词
  • visibilitychange 兜底:标签页重新可见时也同步一次;同步失败时仅 BFCache 场景整页刷新(避免离线时切回标签页直接跳错误页)

验证

  • 合成 pageshow(persisted=true) 驱动同步:未读 → 已读 局部更新 PASS(含圆点移除、角标同步)
  • 桌面 / 平板 / 移动三视口布局回归无异常、无横向溢出
  • 全量 go test 通过
## 问题 未读邮件点进去(阅读页自动标记已读)再返回列表,仍显示未读,需要手动刷新。 原因:浏览器从 BFCache(往返缓存)恢复的是旧 DOM,不会重新请求服务器,服务端已更新的已读状态无法反映到列表。 ## 修复 - 将三个列表页(inbox/drafts/sent)的交互脚本提取为公共模板 `listjs`(base.html),消除三份重复 - 监听 `pageshow(persisted=true)`(BFCache 恢复的标准事件):静默 fetch 当前列表页,局部更新行状态——未读类/蓝点、已删除行移除、侧栏未读角标、共 N 封计数;不整页刷新,保留滚动位置与搜索词 - `visibilitychange` 兜底:标签页重新可见时也同步一次;同步失败时仅 BFCache 场景整页刷新(避免离线时切回标签页直接跳错误页) ## 验证 - 合成 pageshow(persisted=true) 驱动同步:未读 → 已读 局部更新 PASS(含圆点移除、角标同步) - 桌面 / 平板 / 移动三视口布局回归无异常、无横向溢出 - 全量 go test 通过
dsh added 1 commit 2026-08-18 11:08:22 +08:00
问题:打开未读邮件(阅读页已自动标记已读)后返回列表,浏览器从 BFCache
恢复旧 DOM,列表仍显示未读,需手动刷新。

修复:
- 三个列表页的交互脚本提取为公共模板 listjs(base.html),行为一致
- pageshow(persisted=true) 时静默 fetch 最新列表并局部更新行状态
  (未读类/圆点/已删除行/未读角标/总数),不整页刷新、保留滚动
- visibilitychange 兜底:标签页重新可见时也同步一次(离线失败静默忽略,
  仅 BFCache 场景失败才整页刷新)
- 验证:合成 pageshow 事件驱动同步,未读->已读局部更新 PASS;
  桌面/移动/平板布局回归无异常
kevin merged commit 6484af7e63 into main 2026-08-18 11:18:30 +08:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kevin/mailgo#9