vue 3 组合式 api 封装 indexeddb 实现状态同步,核心是将数据库操作抽象为响应式逻辑,使组件能像读写 ref 一样自然操作持久化状态,并自动处理增删改同步与响应更新。

Vue 3 组合式 API 封装 IndexedDB 实现状态同步,核心在于把数据库操作抽象为可复用的响应式逻辑,同时规避 IndexedDB 的异步回调陷阱和事务生命周期问题。重点不是“连上数据库”,而是让组件能像读写 ref 一样自然地读写持久化状态,并自动处理增删改触发的同步与响应更新。
用 useIndexedDB 管理连接与对象仓库
封装一个顶层 hook 负责初始化数据库、创建/升级 schema、缓存 db 实例,避免每次调用都重复打开连接:
- 使用
onBeforeUnmount关闭闲置连接(IndexedDB 不支持显式 close,但可设 flag 防止后续误用) - 用
ref缓存IDBDatabase实例,配合watch监听版本变更触发 upgradeNeeded 逻辑 - 将 objectStore 名称、keyPath、indexes 作为参数传入,支持多 store 复用同一 hook
用 useObjectStore 封装增删改查与响应式映射
每个业务状态对应一个 objectStore,该 hook 提供类 Vuex 的语义化方法,同时返回响应式数据:
-
data: ref<record any>></record>—— 自动监听 store 变更并反向同步(如其他标签页写入),用IDBObserver(Chrome 125+)或轮询 + lastModified 时间戳兜底 -
get(key)/set(key, value)/remove(key)—— 返回 Promise,内部自动复用事务,失败时 reject 并抛出结构化错误(含 store 名、操作类型、原生 event) -
syncFromRemote()—— 预留接口,方便后续对接后端 diff 同步(如只拉取 change feed)
状态同步的关键细节:事务、冲突与响应时机
IndexedDB 不是简单 key-value,状态同步必须直面它的约束:
- 所有写操作必须在事务中完成;hook 内部应自动创建
readwrite事务,并在 Promise resolve 后隐式结束(不手动 abort) - 主键冲突(如重复 insert)默认转为 put 操作,避免报错中断流程;若需强校验,提供
strict: true选项 - 响应式更新不能依赖
onsuccess——它可能在事务提交前触发。正确做法是:写操作 Promise resolve 后,再setTimeout(() => { /* 更新 ref */ }, 0)或用queueMicrotask确保 DOM 更新队列已刷新
在组件中轻量接入,保持关注点分离
组件只需声明依赖,无需感知 IndexedDB 生命周期:
-
不要在
setup()中直接调用 open();统一通过useObjectStore('userPrefs')获取封装好的实例 - 用
v-model绑定到data.value.theme即可,修改自动落库;页面刷新后从 DB 恢复初始值 - 跨组件共享状态?导出同一个
useObjectStore实例(单例模式),或用 provide/inject 注入 store 实例
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










