为啥我的 RemoveItem 功能不起作用? - 上下文 API - 反应

Posted

技术标签:

【中文标题】为啥我的 RemoveItem 功能不起作用? - 上下文 API - 反应【英文标题】:Why is my RemoveItem function not working? - Context API - React为什么我的 RemoveItem 功能不起作用? - 上下文 API - 反应 【发布时间】:2021-11-06 08:57:31 【问题描述】:

我正在构建一个购物篮电子商务应用程序,我的添加到购物车功能运行良好,但是当我使用我的删除项目功能时它不起作用,实际上它只是再次将相同的项目添加到购物车但随后显示总数作为 NaN。

我只是使用 .filter 来返回一个新数组,其中没有我想通过使用它的 id 删除的项目,所以不确定这是怎么发生的。

如果您想在代码沙箱中复制我所说的内容,只需点击添加到购物车按钮 - 然后点击右上角的购物篮图标进入购物篮页面 - 然后点击减号按钮删除该商品。

代码沙箱here

代码如下:

CartReducer.js

import ADD_TO_CART, REMOVE_ITEM from '../Types'

export const CartReducer = (state, action) => 
    switch (action.type) 
        case ADD_TO_CART: 
            return 
                ...state,
                cartItems: [...state.cartItems, action.payload],
            
        
        case REMOVE_ITEM: 
            return 
                ...state,
                cartItems: state.cartItems.filter((item) => item.id !== action.payload.id),
            
        
        default: 
            return state
    

CartState.js

import  useReducer  from 'react'
import  CartContext  from './CartContext'
import CartReducer from './CartReducer'
import  SHOW_HIDE_CART, ADD_TO_CART, REMOVE_ITEM  from '../Types'
import products from '../../pages/ProductDetailsPage'


export const CartState = (children) => 

    const initialState =
        // showCart: false,
        products: products,
        cartItems: [],

    ;

    const [state, dispatch] = useReducer(CartReducer, initialState);

    const addToCart = (item) => 
        dispatch(type: ADD_TO_CART, payload: item)
    ;

 
    const removeItem = (id) => 
        dispatch( type: REMOVE_ITEM, payload: id );
    ;


    return (
        <CartContext.Provider 
            value=
                products: state.products,
                cartItems: state.cartItems,  
                addToCart,
                removeItem,
            >
            children
        </CartContext.Provider>
    )
;

BasketItem.js

import React,  useContext  from 'react'
import image from '../assets/image.png'
// import  QuantityButtonDiv  from '../components/QuantityButtonDiv'
import plusButtonImage from '../assets/vector+.png'
import subtractButtonImage from '../assets/vector.png'
import  CartContext  from '../context/cart/CartContext'


export const BasketItem = (item) => 

    const  cartItems, removeItem  = useContext(CartContext);

    return (
        <div className="basket-item">
            <div className="title-div">
                <span>
                    item.title
                </span>
            </div>
            <div className="image-div">
                <img style=height: "100%", width: "100%" src=image/>
            </div>
            <div className="price-div">
                <span>
                    £item.price
                </span>
            </div>
            <div className="basket-quantity-div">
                <button onClick=() => removeItem(item.id) className="subtract-btn">
                    <img src=subtractButtonImage/>
                </button>
                <span className="quantity-value">
                    cartItems.length
                </span>
                <button className="add-btn">
                    <img src=plusButtonImage/>
                </button>
            </div>  
            <div className="total-div">
                £cartItems.reduce((amount, item) => item.price + amount, 0)
            </div>
        </div>

    )

【问题讨论】:

【参考方案1】:

您是否仔细检查了 removeItem 功能?

在 dispatch 中你发送 payload: id 然后 reducer 从 payload.id 中获取值。如果你想以这种方式管理 reducer,你必须在有效负载中发送一个对象 id: id 或简写的 id

【讨论】:

感谢您抽出宝贵时间查看此内容,您能否详细说明您的意思?我只是尝试实施您提到的解决方案并没有解决问题。

以上是关于为啥我的 RemoveItem 功能不起作用? - 上下文 API - 反应的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的账单计算功能不起作用?

为啥我的前向声明不起作用? (简单功能)

为啥发件人行在我的邮件功能上不起作用?

为啥我的控制器中的保存功能不起作用?

为啥我的点击功能在移动设备上的这个 SVG 内不起作用,但在桌面上却起作用?

为啥我的函数在调用时不起作用? [关闭]