核心用法
该技能提供了一套完整的 React 购物车状态管理方案,主要解决三大问题:重复商品预防、本地持久化存储、上下文状态共享。
重复预防机制
核心思路是维护一个独立的 productIdsInCart 状态(或从 cartItems 派生),在调用 addToCart 时先检查 productIdsInCart.includes(item.id)。这种设计将校验逻辑集中在 CartContext 中,避免散落在各子组件。
localStorage 持久化
- 初始化时读取:组件挂载时从
localStorage.getItem('cart')恢复购物车数据 - 变更时写入:每次增删操作后同步更新 localStorage,可选同时保存
cart_ids便于快速查找 - 跨会话防重:结合 ID 检查机制,确保刷新或新开标签页后不会重复添加
CartContext 设计模式
推荐将 addToCart、removeFromCart、updateQuantity 等逻辑封装在 Context Provider 中,通过 useCart() hook 供子组件消费,保持组件层级的纯粹性。
显著优点
1. 数据一致性:双重校验(内存状态 + localStorage)确保购物车数据可靠
2. 性能友好:ID 数组的 O(1) 查找比遍历对象数组更高效
3. 职责清晰:业务逻辑与 UI 分离,便于测试和维护
4. 即开即用:提供可直接复制的 TypeScript 代码片段
潜在局限
- 存储容量:localStorage 通常限制 5-10MB,不适合超大型购物车(如批发场景)
- 无服务端同步:方案为纯前端实现,用户换设备时数据丢失,需额外接入用户系统
- 无乐观更新/错误回滚:网络异常时缺乏自动重试机制
- 类型安全依赖:示例未展示完整的 CartItem 类型定义和边界处理
适合人群
- 前端初学者学习 React Context 与状态管理
- 需要快速搭建电商 MVP 的独立开发者
- 维护中小型 React 项目的工程师
常规风险
| 风险点 | 说明 |
|--------|------|
| localStorage XSS | 若存储用户输入内容,需防范 XSS 注入 |
| 存储超限 | 大量商品图片 base64 编码可能超出配额 |
| 竞态条件 | 多标签页同时操作可能导致数据覆盖(可考虑 `storage` 事件同步) |
| 敏感信息泄露 | 避免在 localStorage 保存价格、用户信息等敏感数据 |
改进建议
- 引入 IndexedDB 替代 localStorage 以突破容量限制
- 添加
window.addEventListener('storage')实现多标签页同步 - 结合 React Query/SWR 实现服务端购物车同步