Skip to content

06 状态管理

6.1 Pinia

项目使用 Pinia 管理跨页面状态,Store 位于 app/stores/,通过 Nuxt 自动导入或显式导入使用。

当前主要 Store:

  • user:登录态、用户资料、访问 Token 和刷新 Token。
  • cart:有效商品、失效商品、金额汇总和购物车操作。
  • cartUI:购物车 loading、局部操作 loading 和更新时间。
  • product:商品相关页面状态。
  • counter:基础示例状态。

6.2 用户状态

useUserStore() 初始化时从 Cookie 读取 tokenrefreshToken。登录流程为:

text
登录 API
  → AuthTransformer 转换登录模型
  → setToken 写入 Store 和 Cookie
  → fetchUserInfo 拉取会员资料
  → 页面读取 isLoggedIn / userInfo

支持账号密码登录、手机验证码登录、登出、用户资料拉取和 Token 刷新。用户资料请求并发时通过共享 Promise 合并请求,避免重复拉取。

登录成功后 Token Cookie 默认有效期为 7 天,刷新 Token Cookie 默认有效期为 30 天。登出会清理认证信息并重置本地购物车。

6.3 购物车状态

购物车 Store 同时维护:

  • items:有效商品。
  • invalidItems:失效商品。
  • cartTotalPrice:后端返回的商品总计,单位为分。
  • discountFee:后端返回的优惠金额,单位为分。
  • initialized:是否完成初始化。

购物车缓存使用客户端 localStoragecart_cache。恢复缓存时会重新构造 MoneyValueObjectQuantityValueObject,避免 JSON 序列化后丢失值对象行为。

6.4 乐观更新

删除商品、修改数量、切换选中状态和全选操作采用乐观更新:

text
立即更新本地状态
  → 调用后端接口
  → 成功:静默同步汇总
  → 失败:恢复旧状态并抛出错误

涉及金额和数量的修改应使用值对象校验,不要直接绕过 MoneyValueObjectQuantityValueObject

6.5 Store 使用原则

  • 页面级临时状态优先使用组件 ref,不要全部放入 Store。
  • Store action 负责业务操作和异常边界,组件负责展示和交互。
  • SSR 代码中不要直接读取 localStorage。
  • 修改 Store 状态结构时同步调整类型、Transformer、缓存恢复逻辑和测试。