You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Redux实现点击按钮仅添加单个菜品到购物车?

修复单个菜品添加到购物车的逻辑

1. 调整MenuItem.tsx的触发逻辑

原来的代码可能是传递分类ID来触发添加动作,现在要改成传递当前点击的单个菜品对象:

// 修改前(错误逻辑)
const handleAddToCart = () => {
  dispatch(addToCart(categoryId));
};

// 修改后(正确逻辑)
const handleAddToCart = () => {
  dispatch(addToCart(menuItem)); // menuItem是当前组件接收的单个菜品props
};

2. 更新Redux Action的类型定义

在你的action类型文件中,把ADD_TO_CART的payload类型从分类ID改为单个菜品对象:

// 先定义菜品类型(如果还没有的话)
export interface MenuItem {
  id: string;
  name: string;
  price: number;
  category: string;
  // 其他菜品属性
}

// 修改ADD_TO_CART的Action类型
export type AddToCartAction = { type: 'ADD_TO_CART', payload: MenuItem };

3. 修改rootReducer中的ADD_TO_CART处理逻辑

原来的reducer是根据分类ID批量添加菜品,现在要改成只添加单个菜品,同时处理重复添加时的数量累加:

// 修改前(错误逻辑)
case 'ADD_TO_CART':
  const categoryItems = initialState.menu.find(cat => cat.id === action.payload)?.items || [];
  return {
    ...state,
    cart: [...state.cart, ...categoryItems]
  };

// 修改后(正确逻辑)
case 'ADD_TO_CART':
  // 检查购物车中是否已存在该菜品
  const existingItemIndex = state.cart.findIndex(item => item.id === action.payload.id);

  if (existingItemIndex >= 0) {
    // 已有该菜品,数量加1
    const updatedCart = [...state.cart];
    updatedCart[existingItemIndex] = {
      ...updatedCart[existingItemIndex],
      quantity: (updatedCart[existingItemIndex].quantity || 1) + 1
    };
    return { ...state, cart: updatedCart };
  } else {
    // 无该菜品,添加新条目并初始化数量为1
    return {
      ...state,
      cart: [...state.cart, { ...action.payload, quantity: 1 }]
    };
  }

4. 适配Cart.tsx的渲染逻辑

确保购物车组件能正确渲染带数量的菜品条目:

{cart.map(item => (
  <div key={item.id} className="cart-item">
    <span>{item.name}</span>
    <span>数量: {item.quantity}</span>
    <span>总价: ${item.price * item.quantity}</span>
  </div>
))}

完成以上修改后,点击菜品的“Add To Cart”按钮就只会添加当前点击的单个菜品,重复点击会累加对应菜品的数量。

内容的提问来源于stack exchange,提问作者A. Hargrove

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:06:25