javascript - 反应 OnClick 迭代
问题描述
我想做一个 onClick 计数器,但我遇到了计数器正确迭代的问题。在应用程序中有 3 个“产品”,单击“添加到购物车”按钮后,对象的状态会更新,但所有产品都是单独生成的。我认为这是导致每个产品的计数器不同的问题,或者如果我提升状态,一切都会正常工作,但是console.log只是为所有产品新生成的。我不太确定,所以我需要帮助。
这是从父级到最后一个子级的一些代码:
import { useEffect, useState } from "react";
import ProductList from "./ProductList";
const Products = () => {
const [products, setProducts] = useState (null);
useEffect (() => {
fetch('http://localhost:8000/products')
.then(res => {
return res.json();
})
.then(data => {
setProducts(data);
})
}, []);
return (
<div className="ProductList">
{products && <ProductList products={products}/>}
</div>
);
}
export default Products;
import Card from "./Card";
const ProductList = (props) => {
const products = props.products;
return (
<div className="ProductList" >
{products.map((product) => (
<Card product={product} key={product.id} />))}
</div>
);
}
export default ProductList;
import { useState } from "react";
const Card= ({ product }) => {
const [showDescription, setShowDescription] = useState(false);
const [CartCounter, setCartCounter ] = useState(0);
console.log(CartCounter);
return (
<div className="Product-Preview" >
<div className="backdrop" style={{ backgroundImage: `url(${product.image})` }}></div>
<h2>{product.title}</h2>
<div>{product.price}</div>
<button className="ShowDescription" onClick={() => setShowDescription(!showDescription)}>Details</button>
<button className="AddToCart" onClick={() => setCartCounter(CartCounter + 1)}>Add To Cart </button>
{showDescription && <p>{product.description}</p>}
<br />
</div>
);
};
export default Card;
解决方案
好的,您想要跟踪聚合值。我将列出一些高级别的代码。
const ProductList = () => {
const [count, setCount] = useState(0)
const addOrRemove = n => { setCount(v => v + n) }
return products.map(p => <Card addOrRemove={addOrRemove} />)
}
const Card = ({ addOrRemove }) => {
// optional if you want to track card count
// const [count, setCount] = useState(0)
return (
<>
<button onClick={() => { addOrRemove(1) }>Add</button>
<button onClick={() => { addOrRemove(-1) }>Remove</button>
</>
)
}
本质上,无论您是否跟踪本地计数,您都需要让父母决定最终计数是多少,否则孩子和父母之间会出现一些不同步的问题。
推荐阅读
- linux - srun 在循环中使用: srun:作业步骤中止:等待作业步骤完成最多 32 秒
- javascript - pandoc:从markdown转换时添加html事件如onload
- git - Git选项卡完成停止在远程分支上工作
- python - 获取输出到 csv - python
- python-3.x - Python中的负切片步骤没有得到输出
- javascript - 在 useEffect 中使用 useState 时 Map 不是函数
- bash - Shell 脚本 - IFS 读取语法错误:意外重定向
- c - 来自 Linux 驱动程序的 32 字节 PCIe 事务
- django - 如何在 django admin 中获取自定义列的总和?
- android - 需要适用于 Unity 的 Facebook Audience Network 6.0.0 更新