【发布时间】:2021-03-29 20:47:15
【问题描述】:
因此,至少对我来说,我正在处理一个相当复杂的问题。在这里,我有基本的购物车功能(添加、删除等)。我面临的问题是这样的。所以我可以将一个项目添加到购物车,但是当我尝试将不同的项目添加到购物车时它没有这样做。当我尝试添加我之前添加的相同项目时,它正在改变购物车项目的数量,所以这是一种工作。我在结帐组件中的总计有问题,它显示的是 NaN 而不是总价格。我知道这是相当多的代码,如果有人能指出我的错误,我将不胜感激。谢谢
上下文 API
import React from "react";
function getCartFromLocalStorage() {
return localStorage.getItem("cart")
? JSON.parse(localStorage.getItem("cart"))
: [];
}
const CartContext = React.createContext({});
function CartProvider({ children }) {
const [cart, setCart] = React.useState(getCartFromLocalStorage());
const [total, setTotal] = React.useState(0);
const [cartItems, setCartItems] = React.useState(0);
function onUpdate() {
localStorage.setItem("cart", JSON.stringify(cart));
// total
let newTotal = cart.reduce((total, cartItem) => {
return (total += cartItem.amount * cartItem.RegularPrice);
}, 0);
newTotal = parseFloat(newTotal.toFixed(3));
setTotal(newTotal);
// cartItems
let newCartItems = cart.reduce((total, cartItem) => {
return (total += cartItem.amount);
}, 0);
setCartItems(newCartItems);
}
React.useEffect(onUpdate, [cart]);
// remove
const removeItem = (key) => {
setCart([...cart].filter((item) => item.key !== key));
};
// addToCart
const addToCart = (book) => {
const { key, image, bookName, by, RegularPrice } = book;
let item = cart.find((item) => item.key === key);
if (item) {
item.amount++;
onUpdate();
} else {
setCart(
cart.concat({
amount: 1,
price: book.RegularPrice,
...book
})
);
}
};
const clearCart = () => {
setCart([]);
};
return (
<CartContext.Provider
value={{
cart,
cartItems,
total,
removeItem,
addToCart,
clearCart
}}
>
{children}
</CartContext.Provider>
);
}
export { CartContext, CartProvider };
购物车链接
import React from "react";
import { Link } from "react-router-dom";
import {FiShoppingCart} from 'react-icons/fi'
import { CartContext } from "../../context/cart";
export default function CartLink() {
const { cartItems} = React.useContext(CartContext);
return (
<div className="cartlink__container">
<Link to="/cart">
<FiShoppingCart />
</Link>
<span className="cartlink__total">{cartItems}</span>
</div>
);
}
购物车物品
import React, { useContext } from "react";
import { CartContext } from "../../context/cart";
import Checkout from "./Checkout";
export default function CartItem({ key, image,bookName, RegularPrice, by, amount }) {
const {removeItem} = useContext(CartContext)
return (
<div key={key} className="cart__item">
<img className='cart__image' src={image} />
<div className='cart__itemdesc'>
<h4>{bookName}</h4>
<h6 className='cart__by'>By: {by}</h6>
<button
className="cart__removebtn"
onClick={() => {
removeItem(key);
}}
>
Remove
</button>
</div>
<span className='circle'><span className='circleone'></span></span>
<span>{RegularPrice}</span>
<div>
<Checkout />
</div>
</div>
);
}
结帐
import React,{useContext} from 'react'
import { CartContext } from '../../context/cart'
import {Link, useHistory } from 'react-router-dom'
import EmptyCart from './EmptyCart';
const Checkout = () => {
const history = useHistory()
const {cart, total} = useContext(CartContext)
if (cart.length === 0) {
return <EmptyCart />;
}
return (
<div>
<Link to='/stripecontainer' className='checkout__btnOne'>Proceed to
Checkout</Link>
<h2>total : ${total}</h2>
</div>
)
}
export default Checkout
import React,{useState, useEffect, useContext} from 'react'
import './Home.css'
import Books from './Books'
import { BookContext } from "../../context/books";
const Home = () => {
const {data, handleSelectCategory, currentSelectedCategory } =useContext(BookContext)
return (
<div className='books__container' >
<h1 className='categories'>Categories</h1>
{Object.keys(data).map((key, index)=>{
let books = data[key];
return (
<>
<span key={key} onClick={() => handleSelectCategory(key)} className='books__list' >
{books[0].category}
</span>
</>
);})}
<Books category={currentSelectedCategory} />
</div>
)
}
export default Home
【问题讨论】:
-
let newCartItems = cart.reduce((total, cartItem) => { return (total += cartItem.amount); }, 0); setCartItems(newCartItems);使用单个号码调用setCartItems,这可能是您想要的,但听起来很奇怪。我希望setCartItems采用 CartItem 对象的数组... -
在购物车项下:
<button className="cart__removebtn" onClick={() => { removeItem(key); }}>看起来很可疑...通常 html 事件侦听器被包裹在"... 所以如果这不会导致不相关的问题,我想我学到了一些新东西今天。 -
@ShanerM13 我想你学到了一些新东西。
-
@异端猴还是一样
-
@ShanerM13 请求并发布 CodeSandbox 完全没问题。问题是提问者只是链接到 CodeSandbox 并且没有也在他们的问题正文中包含相关代码。
标签: javascript node.js reactjs redux react-context