Vue 3 的 watch 无法直接监听离线缓存状态,需将 navigator.onLine、IndexedDB 操作或状态管理中的缓存状态封装为响应式 ref(如 isOnline、cacheVersion、store 状态),再用 watch 侦听其变化触发同步;注意手动绑定/解绑 online/offline 事件、避免 deep、合理使用 immediate 和防抖。

Vue 3 中 watch 本身不直接监听“离线缓存状态”,因为浏览器的离线能力(如 Service Worker、Cache API、IndexedDB)和网络状态(navigator.onLine)都不是 Vue 响应式系统原生追踪的数据源。要实现基于离线缓存状态的数据同步,关键在于:**把非响应式的缓存/网络状态封装成响应式信号,再用 watch 侦听它变化,触发同步逻辑**。
把网络在线状态转为响应式 ref
浏览器的 navigator.onLine 是只读属性,且不会自动触发 Vue 更新。需手动监听 online/offline 事件,并用 ref 维护其响应式状态:
- 定义
isOnline = ref(navigator.onLine) - 在
onMounted中添加事件监听器:window.addEventListener('online', () => isOnline.value = true)和window.addEventListener('offline', () => isOnline.value = false) - 用
watch(isOnline, (newVal) => { if (newVal) syncPendingData() })触发同步
监听 IndexedDB 或本地缓存变更(需手动触发)
IndexedDB 没有内置响应式通知机制。常见做法是:在写入缓存成功后,主动更新一个响应式标志位:
从零开始编排 SpringBoot+Vue 全栈项目工作流,适用于新建全栈项目或完整脚手架请求,触发后依次调用 product‑spec‑builder(需求调研)等模块。
- 声明
cacheVersion = ref(0)作为缓存“版本号” - 每次成功写入 IndexedDB 后执行
cacheVersion.value++ - watch 它:
watch(cacheVersion, () => fetchLatestFromCache()) - 也可结合自定义事件(如
dispatchEvent(new Event('cache-updated')))+onMounted(() => window.addEventListener('cache-updated', ...)),但 watch ref 更统一
配合 Vuex/Pinia 管理缓存状态(推荐)
若项目已用状态管理库,把缓存状态纳入 store 更利于跨组件同步:
- Pi nia 示例:
const cacheStore = useCacheStore(); watch(() => cacheStore.isSyncing, (isSyncing) => { if (!isSyncing && cacheStore.pendingCount > 0) cacheStore.syncAll() }) - Vuex 用户注意:不能直接
watch(() => $store.state.cache.status),必须用computed(() => $store.state.cache.status)包裹后再 watch,否则响应性失效 - 在 store 的 mutation 中更新缓存状态时,同步触发
cacheStatus.value = 'synced'等响应式字段,确保 watch 可捕获
避免常见坑:deep、immediate 与副作用清理
同步逻辑常涉及异步操作(如 fetch),需注意 watch 配置:
- 加
{ immediate: true }可在组件挂载时立即检查是否需补同步(比如刚从离线恢复) - 不用
deep: true——isOnline是布尔值,cacheVersion是数字,浅监听足够 - 在
onUnmounted中取消事件监听(如window.removeEventListener('online', handler)),防止内存泄漏 - 若同步过程可能被重复触发(如多次快速切网),建议加防抖或用
ref(isSyncing)锁定状态
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!









