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

如何使用Redux Toolkit改造移动端商城购物车Reducer

购物车 Redux Toolkit 完整实现方案

1. 定义购物车 Slice

基于商品ID+数量的数据结构,用createSlice实现包含所有核心功能的reducer和action:

import { createSlice } from '@reduxjs/toolkit';

// 初始状态:购物车商品列表
const initialState = {
  cartItems: []
};

const cartSlice = createSlice({
  name: 'cart',
  initialState,
  reducers: {
    // 添加商品:已存在则加量,不存在则新增
    addToCart: (state, action) => {
      const targetItem = state.cartItems.find(item => item.id === action.payload.id);
      if (targetItem) {
        targetItem.quantity += 1;
      } else {
        // 默认数量为1,合并传入的商品信息
        state.cartItems.push({ ...action.payload, quantity: 1 });
      }
    },
    // 单独增加指定商品数量
    increaseQuantity: (state, action) => {
      const item = state.cartItems.find(item => item.id === action.payload);
      if (item) item.quantity += 1;
    },
    // 减少商品数量:数量为1时直接移除
    decreaseQuantity: (state, action) => {
      const item = state.cartItems.find(item => item.id === action.payload);
      if (item) {
        item.quantity > 1 ? item.quantity -= 1 : 
          state.cartItems = state.cartItems.filter(i => i.id !== action.payload);
      }
    },
    // 移除指定商品
    removeFromCart: (state, action) => {
      state.cartItems = state.cartItems.filter(item => item.id !== action.payload);
    },
    // 清空购物车
    clearCart: (state) => {
      state.cartItems = [];
    }
  }
});

// 导出所有action creator,供组件调用
export const { 
  addToCart, 
  increaseQuantity, 
  decreaseQuantity, 
  removeFromCart, 
  clearCart 
} = cartSlice.actions;

// 导出reducer,用于配置store
export default cartSlice.reducer;

2. 整合到已创建的Store中

将购物车reducer添加到你的store配置里(假设你的store是用configureStore创建的):

import { configureStore } from '@reduxjs/toolkit';
// 导入刚才创建的购物车reducer
import cartReducer from './path/to/cartSlice';

export const store = configureStore({
  reducer: {
    // 挂载到cart命名空间下
    cart: cartReducer,
    // 其他reducer...
  }
});

3. 组件中使用示例

通过useSelector获取购物车状态,useDispatch触发action:

import { useSelector, useDispatch } from 'react-redux';
import { 
  addToCart, 
  increaseQuantity, 
  decreaseQuantity, 
  removeFromCart, 
  clearCart 
} from './path/to/cartSlice';

function Cart() {
  // 获取购物车列表
  const cartItems = useSelector(state => state.cart.cartItems);
  const dispatch = useDispatch();

  // 示例:添加商品到购物车(payload为商品对象,需包含id)
  const handleAddProduct = (product) => {
    dispatch(addToCart(product));
  };

  return (
    <div className="cart">
      {cartItems.map(item => (
        <div key={item.id} className="cart-item">
          <h3>{item.name}</h3>
          <div className="quantity-control">
            <button onClick={() => dispatch(decreaseQuantity(item.id))}>-</button>
            <span>{item.quantity}</span>
            <button onClick={() => dispatch(increaseQuantity(item.id))}>+</button>
          </div>
          <button onClick={() => dispatch(removeFromCart(item.id))}>删除</button>
        </div>
      ))}
      <button className="clear-btn" onClick={() => dispatch(clearCart())}>清空购物车</button>
    </div>
  );
}

export default Cart;

关键说明

  • Redux Toolkit的createSlice内置Immer,允许直接修改state(无需手动返回新状态),内部会自动生成不可变更新。
  • addToCart的action payload需要包含商品的id,以及你需要展示的其他商品信息(如名称、价格等)。
  • 所有action creator都是自动生成的,直接导出即可在组件中使用。

内容的提问来源于stack exchange,提问作者Jesee Kiigu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:40:31