pinia需借助插件实现购物车本地持久化:h5用pinia-plugin-persistedstate,uniapp用pinia-plugin-unistorage;仅通过paths指定cartlist等可序列化字段缓存,避开loading等临时状态;登录时合并本地与服务端数据,支持游客态与登录态双模式切换。

Pinia 本身不保存数据到本地,购物车一刷新就清空。要实现本地离线缓存,核心是把 cartList 这类关键状态自动存进设备的持久化存储,并在页面加载时自动还原——不需要手动写 localStorage.setItem 或 uni.setStorageSync。
选对插件:按运行环境决定
不同平台底层存储 API 不同,不能混用:
-
H5 网页项目:用
pinia-plugin-persistedstate,默认对接localStorage,开箱即用 -
UniApp(小程序 / App / H5):必须用
pinia-plugin-unistorage,它能自动识别当前平台(如微信小程序调用uni.setStorageSync,H5 调用localStorage),统一处理
在购物车 store 中精准配置 persist
不是整个 cartStore 都要存,只存真正需要离线可用的数据,比如商品列表、数量、选中状态:
- 用
paths显式指定字段:paths: ['cartList', 'totalPrice', 'checkedIds'] - 避免存临时 UI 状态:
loading、isEditing、函数或 Date 对象——它们无法被 JSON 序列化,存了也无效 - 敏感字段如用户 ID 若已脱敏且非凭证类,可存;但 token、密码等绝不可明文落盘
注意离线场景下的行为一致性
本地缓存不只是“存进去”,更要保证用户体验连贯:
- 用户未登录时,购物车完全走本地缓存;登录后建议做一次合并(本地 + 服务端),避免商品丢失
- 小程序无痕模式、H5 跨域 iframe 下,
localStorage可能不可用,插件会自动降级为内存存储,不报错 - 数据损坏(如 JSON 解析失败)时,插件静默跳过,state 保持初始值,不影响应用启动
补充:支持双模式切换(游客态 ↔ 登录态)
真实业务中,购物车常需兼容两种状态:
- 游客访问:所有操作只写入本地缓存
- 用户登录:将本地 cartList 合并到服务端购物车,后续操作同步远程
- 登出时,可选择保留本地 cartList(方便再次游客浏览)或清空,由业务逻辑控制










