可行但需手动控制:本地存未读ID数组,本页修改后立即更新UI并存localStorage,其他页面监听storage事件重算角标;需过滤过期ID、兼容无localStorage环境,且仅解决同源多页同步。

直接用 Storage 事件同步未读消息数是可行的,但不能只靠它“自动更新数字”——它只是通知机制,真正显示什么、怎么算、是否清空,都得你手动控制。
核心逻辑:本地存状态 + 跨页发通知 + 页面自己重算
未读消息数本质是个聚合值(比如“你有3条未读”),它不等于某条消息的已读/未读状态,而是所有未读消息 ID 的数量。Storage 事件本身不计算这个数,只告诉你“某条消息状态变了”,你需要:
- 在 localStorage 中结构化存储未读消息 ID 列表(如 ['msg_101', 'msg_102', 'msg_103'])
- 每次增删 ID 后,调用 localStorage.setItem('unreadIds', JSON.stringify(ids))
- 所有页面监听 storage 事件,当 key === 'unreadIds' 时,重新读取并渲染角标:document.getElementById('badge').textContent = ids.length
本页修改也要立刻更新 UI,不能等 storage 事件
Storage 事件不会在触发修改的当前页面中触发。比如你在 A 标签页点击“全部已读”,执行了 localStorage.removeItem('unreadIds'),A 页面自己收不到 event,UI 就不会变——必须同步更新本页视图:
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
- 操作后立刻重读:const ids = JSON.parse(localStorage.getItem('unreadIds') || '[]')
- 立刻赋值角标:badge.textContent = ids.length
- 再加监听器处理其他页面的变更(补全跨页同步)
避免重复、过期和兼容性问题
真实场景中,用户可能开多个标签页看同一套消息系统,需注意三点:
- 只存 ID,不存内容:localStorage 只缓存未读消息 ID 数组,正文、时间等从服务端或内存里拿,避免冗余和不一致
- 加过期判断:存入时附带时间戳字段,读取时过滤掉 7 天前的 ID,防止长期未清理导致角标滞留:ids.filter(id => msgMap[id]?.timestamp > Date.now() - 604800000)
- 兜底兼容:开头检测 if (typeof localStorage === 'undefined'),降级为内存数组 + 手动广播(如 postMessage),确保私密模式或老浏览器仍可运行
小红点数字不是“状态”,而是“快照”
未读消息数不是实时数据库字段,它是当前设备上最后一次同步下来的快照。用户在手机 App 上已读某条消息,网页端不会立刻知道——除非你主动拉取服务端最新状态(比如每 30 秒轮询 / 用 WebSocket 推送)。Storage 事件只解决“同源多网页之间”的协同,不解决“跨终端”或“服务端-前端”一致性。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










