Vue 3组合式函数实现离线缓存同步,通过分层持久化(usePersistentState/useIndexedDB)、网络状态感知、冲突检测与乐观更新、离线优先请求封装,统一暴露响应式状态与同步控制。

Vue 3 组合式函数处理离线缓存数据同步,核心是把“本地状态管理”和“网络状态感知+同步策略”封装在一起,用响应式变量暴露当前数据源(内存/本地/远程)、同步状态与冲突标识,并通过明确的触发时机(如网络恢复、用户提交、定时轮询)驱动同步流程。
分层持久化 + 响应式桥接
不直接操作 localStorage 或 IndexedDB 原生 API,而是封装成带响应式的组合式函数,让组件像读写 ref 一样自然使用:
- 用 usePersistentState 管理单个字段级状态(如表单草稿、筛选偏好),自动双向同步到 localStorage,支持类型推导和默认值回退
- 用 useIndexedDB 封装结构化数据(如订单列表、商品缓存),提供 get/set/remove 方法并返回 Promise;内部监听 IDBObserver(Chrome 125+)或轮询 lastModified 时间戳,实现跨标签页变更响应
- 所有持久化 hook 都返回 data: ref<T>、isSynced: ref<boolean>、syncStatus: ref<'idle' | 'syncing' | 'conflict'>,供 UI 直观反馈
网络状态感知与同步触发
同步不是“一直等”,而是结合 navigator.onLine + online/offline 事件 + 自定义心跳检测,主动判断是否具备同步条件:
Vue 3 组合式 API 与 最佳实践,涵盖代码组织、useXxx 模式、组合式函数设计、Store 集成、响应式优化及功能抽取。
- 在组合式函数内用 onMounted 监听 window.online/offline 事件,网络恢复时自动调用 syncToRemote()
- 对关键操作(如收银下单)做双路径处理:在线直连后端;离线则先存入 IndexedDB,标记 status: 'pending',待 online 后批量重发
- 避免竞态:每个 syncToRemote 调用生成唯一 requestId,失败时保留 error 和 retryCount,支持指数退避重试
冲突检测与乐观更新
本地修改与服务端变更可能不一致,需轻量级版本控制而非强锁:
立即学习“前端免费学习笔记(深入)”;
- 每条记录存储 localVersion(自增数字或 timestamp)和 serverVersion(服务端返回的 etag 或 version 字段)
- 同步前比对两者,若 localVersion > serverVersion,说明本地有未上传修改,走“本地优先”合并逻辑;若 serverVersion 更高,提示用户“数据已被他人更新”,提供对比面板或强制刷新选项
- UI 层用 computed 派生 hasUnsyncedChanges,驱动按钮状态(如“同步中…”“有未保存修改”)
离线优先的请求封装(useLazyData 扩展版)
把离线能力下沉到数据请求层,让 useLazyData 不仅能懒加载,还能智能降级:
- 执行 fetch 时先查本地缓存(IndexedDB 或 memory layer),命中则立即返回并标记 fromCache: true
- 同时发起网络请求,成功后更新缓存并触发 data.value 更新;失败则保持缓存数据,设置 error 并记录日志
- 支持配置 staleWhileRevalidate 策略:缓存有效期内直接展示,后台静默更新,兼顾体验与一致性

















