Cart Management Skill
Patterns for React cart state: duplicate prevention, persistence, context design.
Duplicate Prevention
- - Track product IDs in CartContext (separate state or derived from cartItems)
- Check
productIdsInCart.includes(item.id) before add - Centralize logic in context, not in ProductCard or child components
Persistence (localStorage)
- - Initialize cart state from
localStorage.getItem('cart') on mount - Persist on every add/remove: INLINECODE2
- Sync productIdsInCart if used: INLINECODE3
- Prevents duplicates across sessions (refresh, new tab)
CartContext Pattern
CODEBLOCK0
Anti-Patterns
- - Don't add to cart in useEffect on ProductCard mount (causes duplicates)
- Don't duplicate logic in multiple components – use context
- Add backend validation as fallback for data integrity
Quantity Updates
For same-product quantity: use cartItems.map() to update item.quantity, don't create duplicate entries.
购物车管理技能
React购物车状态模式:重复预防、持久化、上下文设计。
重复预防
- - 在CartContext中跟踪产品ID(独立状态或从cartItems派生)
- 在添加前检查productIdsInCart.includes(item.id)
- 将逻辑集中在上下文中,而非ProductCard或子组件中
持久化(localStorage)
- - 挂载时从localStorage.getItem(cart)初始化购物车状态
- 每次添加/移除时持久化:localStorage.setItem(cart, JSON.stringify(cartItems))
- 如果使用productIdsInCart则同步:localStorage.setItem(cart_ids, JSON.stringify(ids))
- 防止跨会话重复(刷新、新标签页)
CartContext模式
tsx
const addToCart = (item: CartItem) => {
if (!productIdsInCart.includes(item.id)) {
setCartItems(prev => [...prev, item]);
setProductIdsInCart(prev => [...prev, item.id]);
localStorage.setItem(cart, JSON.stringify([...cartItems, item]));
}
};
反模式
- - 不要在ProductCard挂载时的useEffect中添加购物车(会导致重复)
- 不要在多个组件中重复逻辑——使用上下文
- 添加后端验证作为数据完整性的后备方案
数量更新
对于相同产品的数量:使用cartItems.map()更新item.quantity,不要创建重复条目。