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

React Redux项目中点击商品组件按钮如何同步更新同级购物车内容?

方案实现步骤

你当前的代码核心问题是加购逻辑没有和Redux打通,同时购物车组件的取值逻辑不符合同页面同级组件的使用场景,按以下步骤修改即可:


1. 调整商品组件(Product.js)

你需要在商品组件内直接调用Redux的dispatch触发加购action,修改后的完整代码如下:

import React, { useState } from 'react';
// 引入Redux相关依赖
import { useDispatch } from 'react-redux';
import { addToCart } from '../../actions/cartActions';

export default function Product(props) {
  const { product } = props;
  // 仅当你需要让用户自定义购买数量时保留这个状态,如果是固定每次加1可以删掉
  const [qty, setQty] = useState(1);
  const dispatch = useDispatch();

  const addToCartHandler = () => {
    // 触发加购action,传入当前商品id和要加的数量
    dispatch(addToCart(product._id, qty));
    // 如果是固定每次加1,上面直接写dispatch(addToCart(product._id, 1))即可,不需要本地qty状态
  };
  return (
    <div key={product._id} className="col-lg-3 col-md-3 col-sm-4 col-xs-6 product">
      <div className="card">
          <div className="image-area">

          </div>
      </div>
      <div className="products-body">
        <div className="price">${product.price}</div>
        <div className="product-name">{product.name}</div>
        <button className="add-button" onClick={addToCartHandler}>Add</button>
      </div>
    </div>
  );
}

2. 修正购物车action(cartActions.js)

你当前action的payload里商品id字段写错了,调整如下:

import Axios from 'axios';
import { CART_ADD_ITEM } from '../constants/cartConstants';

export const addToCart = (productId, qty) => async (dispatch, getState) => {
  const { data } = await Axios.get(`/api/products/${productId}`);
  dispatch({
    type: CART_ADD_ITEM,
    payload: {
      name: data.name,
      price: data.price,
      // 这里原代码写的data.added是错误的,应该取商品id
      product: data._id,
      qty,
    },
  });
  localStorage.setItem('cartItems', JSON.stringify(getState().cart.cartItems));
};

3. 调整购物车组件(Cart.js)

你当前的购物车组件是从路由参数取商品id的逻辑,只适合跳转页面加购的场景,同页面展示需要直接从Redux store取购物车数据,修改后代码如下:

import React from "react";
// 引入useSelector从store取数据
import { useSelector } from "react-redux";

export default function Cart() {
  // 从Redux store取出购物车列表
  const cartItems = useSelector(state => state.cart.cartItems);
  return (
    <div className="cart-box">
      <h3>购物车</h3>
      {cartItems.map(item => (
        <p key={item.product}>
          商品ID: {item.product} 商品名: {item.name} 数量: {item.qty} 单价: ${item.price} 小计: ${item.price * item.qty}
        </p>
      ))}
      {/* 可自行加总价计算逻辑 */}
      <p>总价:${cartItems.reduce((sum, item) => sum + item.price * item.qty, 0)}</p>
    </div>
  );
}

4. 确保购物车reducer逻辑正确

你需要在cartReducer里实现商品重复加购时数量累加的逻辑,参考代码如下:

import { CART_ADD_ITEM } from '../constants/cartConstants';

// 初始化状态,从localStorage读历史数据
const initialState = {
  cartItems: localStorage.getItem('cartItems') ? JSON.parse(localStorage.getItem('cartItems')) : [],
};

export const cartReducer = (state = initialState, action) => {
  switch (action.type) {
    case CART_ADD_ITEM:
      const item = action.payload;
      // 判断商品是否已经在购物车中
      const existItem = state.cartItems.find(x => x.product === item.product);
      if (existItem) {
        // 存在则数量累加
        return {
          ...state,
          cartItems: state.cartItems.map(x => x.product === existItem.product ? {...x, qty: x.qty + item.qty} : x)
        };
      } else {
        // 不存在则新增商品
        return {
          ...state,
          cartItems: [...state.cartItems, item]
        };
      }
    default:
      return state;
  }
};

修改完成后就能实现点击商品的Add按钮,对应商品自动添加到购物车、重复点击数量累加的效果,不需要路由跳转。

内容的提问来源于stack exchange,提问作者magic bean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:39:04