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

如何在Redux中创建cart状态 实现购物车数量更新与电影添加功能

改造步骤

1. 更新Action类型定义

给原来的ActionsTypes新增加购专属类型,原有的QUANTITY类型可以直接删除:

export const ActionsTypes = {
     SET_MOVIES : "SET_MOVIES",
     GET_MOVIE : "GET_MOVIE", 
     REMOVE_MOVIE : "REMOVE_MOVIE",
     ADD_TO_CART: "ADD_TO_CART" // 新增加购动作类型
 }

2. 新增加购Action创建函数

替换原有逻辑单一的MovieQuantity函数,新的动作会携带选中的电影和购买数量作为参数:

export const addItemToCart = (movie, buyQuantity) => {
    return {
        type : ActionsTypes.ADD_TO_CART,
        payload: {
            movie,
            quantity: buyQuantity
        }
    }
}

3. 新建cart reducer

统一管理购物车商品列表和总数量,避免分开维护两个状态出现不同步的问题:

const cartInitialState = {
    items: [], // 存储所有加入购物车的电影、对应购买数量
    totalCount: 0 // 导航栏需要显示的总商品数,直接读取该字段即可
}

export const cartReducer = (state = cartInitialState, action) => {
    switch(action.type) {
        case ActionsTypes.ADD_TO_CART:
            const { movie, quantity } = action.payload
            // 优化逻辑:同个电影重复加购时累加购买数量,不需要新增重复条目
            const existedItemIndex = state.items.findIndex(item => item.movie.id === movie.id)
            let newItems
            if (existedItemIndex > -1) {
                newItems = [...state.items]
                newItems[existedItemIndex].quantity += quantity
            } else {
                newItems = [...state.items, { movie, quantity }]
            }
            return {
                ...state,
                items: newItems,
                totalCount: state.totalCount + quantity
            }
        default:  
            return state;
    }
}

4. 注册cart reducer

在你合并根reducer的位置,新增cartReducer,同时删除原来的movieQuantityReducers注册逻辑:

import { combineReducers } from 'redux'
import { setMoviesReducers, GetMovieDetailsReducers, cartReducer } from './你的reducer文件路径'

const rootReducer = combineReducers({
    movies: setMoviesReducers,
    movie: GetMovieDetailsReducers,
    cart: cartReducer // 新增cart状态
})

5. 修改MovieDetails组件的加购逻辑

调整CartHandler,触发我们刚定义的加购动作:

// add to cart Handler
const CartHandler = () => {
    dispatch(addItemToCart(singleMovie, quantity))
}

6. 修改Navbar组件的取值逻辑

直接从cart状态读取总数量即可:

const Navbar = () => {
    const quantityBag = useSelector((state)=> state.cart.totalCount);
    return (
        <nav className="navBar-section">
            <Link to="/">
                <h1 className="logo">映画館</h1>
            </Link>

            <Badge badgeContent={quantityBag} color="primary">
                 <LocalMall className="icon-bag" />
            </Badge>
        </nav>
    )
}

可选清理

把原来没用的QUANTITY类型、MovieQuantity函数、movieQuantityReducers都删掉,减少冗余代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:48:02