响应式网络状态监听与全局通知系统需封装 navigator.onLine 并绑定 online/offline 事件,通过事件总线或 Context 解耦通知逻辑,配合图标语义、防重弹、重试按钮及离线缓存策略实现高可用体验。

利用响应式状态自动检测网络状态,并构建全局通知系统,核心在于监听 navigator.onLine 的变化、用响应式数据(如 Vue 的 ref / reactive 或 React 的 useState + useEffect)封装网络状态,并将状态变更广播给所有关心的组件——尤其是通知系统。
响应式封装网络状态
浏览器原生提供 navigator.onLine 属性,但它是只读快照,不自动响应。需结合 online 和 offline 事件手动更新:
- 在 Vue 中可封装为一个 composable:
useNetworkStatus() 返回一个响应式 ref(如const isOnline = ref(navigator.onLine)),并在mounted或onMounted中绑定事件监听器; - 在 React 中可用自定义 Hook:
useNetworkStatus() 内部用useState存储状态,useEffect注册事件监听,清理函数中移除监听; - 注意:该 API 有局限——仅检测设备是否“认为”联网(如断开 WiFi 但连着网线可能仍返回 true),不能替代真实请求探测;如需更准确判断,应在状态变更后发起轻量级心跳请求(如 GET /health)并更新状态。
网络状态变更触发全局通知
通知系统不应耦合在状态逻辑里,而应通过解耦方式响应变化:
- 推荐使用事件总线(如 Vue 3 的
createApp().config.globalProperties.$bus或独立的 mitt 实例)、或 React 中的 Context + useReducer + 自定义 dispatch; - 当
isOnline从 false 变为 true,推送「已恢复网络」成功提示;从 true 变为 false,推送「网络已断开」警告提示; - 通知组件自身应具备自动关闭、防重复、堆叠控制等能力,避免同一状态反复弹出多个通知;
- 可加入“重试按钮”:离线通知中提供「立即重试」,点击后尝试发送缓存请求或刷新页面。
通知系统的全局接入与体验优化
让通知真正“全局”,关键在初始化位置和触发时机:
- 在应用入口(如 main.js 或 App.tsx)初始化通知服务,并注册网络状态监听器,确保早于任何业务组件挂载;
- 通知内容需区分语义:离线用黄色/橙色警告图标,恢复用绿色对勾图标,文字简洁明确(如“正在离线工作”、“已重新连接”);
- 避免干扰用户操作:通知默认出现在右下角,不遮挡表单或按钮;高优先级状态(如提交失败)可提升层级或延长显示时间;
- 移动端需适配:小屏下通知宽度设为 90%,留出安全边距,禁用 hover 效果,改用 tap 反馈。
补充:离线优先与状态同步策略
仅通知不够,还需支撑离线场景下的用户连续性:
- 配合
localStorage或IndexedDB缓存待提交数据,网络恢复后自动重发; - 在通知中显示“X 条未同步操作”,点击跳转到同步管理页;
- 对关键操作(如支付、删除)做二次确认:“当前离线,操作将暂存,恢复后提交”,降低误操作风险;
- 服务端接口需兼容幂等性,防止网络抖动导致重复提交。

















