【发布时间】:2021-10-02 04:24:05
【问题描述】:
我创建了一个辅助函数来重用。 在我的第一个组件上,辅助函数运行良好。 但是当我在其他组件上使用它时。它有一个错误,当我将产品添加到收藏夹时,它会添加到收藏夹中,但是当我单击其他产品时,它会覆盖以前添加的收藏夹。
我的助手
function getFromLocalStorage(key) {
return JSON.parse(localStorage.getItem(key))
}
export function setToLocalStorage(key, data) {
return localStorage.setItem(key, JSON.stringify(data))
}
export const favoriteProductsStorageKey = "favorites_products"
export function getAllFavoriteProducts() {
return getFromLocalStorage(favoriteProductsStorageKey) || []
}
export function createFavoriteHelpers(favorites, setFavorites) {
function addFavorite(product) {
const isProductAlreadyFavorite = isProductInFavorites(product);
if (isProductAlreadyFavorite) return;
const newFavoriteProducts = [...favorites, product];
setFavorites(newFavoriteProducts);
setToLocalStorage(favoriteProductsStorageKey, newFavoriteProducts);
}
function removeFavorite(product) {
const newFavoriteProducts = favorites.filter(
(iteratedProduct) => iteratedProduct._id !== product._id
);
setFavorites(newFavoriteProducts);
setToLocalStorage(favoriteProductsStorageKey, newFavoriteProducts);
}
function isProductInFavorites(product) {
return favorites.some(
(iteratedProduct) => iteratedProduct._id === product._id
);
}
return {
addFavorite,
removeFavorite,
isProductInFavorites,
};
}
我的第一个组件运行良好。
const ProductList = ({ products }) => {
const classes = useStyles()
const [favorites, setFavorites] = useState(getAllFavoriteProducts())
const favoriteHelpers = createFavoriteHelpers(favorites, setFavorites)
return (
<>
<div className={classes.root}>
{products?.map((product) => {
return (
<div className="ProductCard" key={product._id}>
<div>
<Link to="/shop" state={{ shop: product.shop }}>
<img
className="ProductImage"
src={product.imagePrimary}
alt={product.name}
/>
</Link>
<div className="FavButton">
{favoriteHelpers.isProductInFavorites(product) ? (
<FavoriteIcon
fontSize="small"
style={{ fill: "red" }}
onClick={() => favoriteHelpers.removeFavorite(product)}
/>
) : (
<FavoriteIcon
fontSize="small"
style={{ fill: "gray" }}
onClick={() => favoriteHelpers.addFavorite(product)}
/>
)}
</div>
</div>
<div className="ProductCardDetails">
<div className="NameAndPrice">
<div className="ProductName">{product.name}</div>
<div className="ProductPrice">P{product.price}</div>
</div>
<div className="Description"> by {product.shop.name}</div>
</div>
</div>
)
})}
</div>
</>
)
}
export default ProductList
在添加和删除时出现错误的那个。
const ProductCard = ({ data }) => {
const [favorites, setFavorites] = useState(getAllFavoriteProducts())
const favoriteHelpers = createFavoriteHelpers(favorites, setFavorites)
return (
<div className="ProductCard">
<div>
<Link to="/product" state={{ product: data }}>
<img
className="ProductImage"
src={data.imagePrimary}
alt={data.name}
/>
</Link>
<div
aria-hidden="true"
className="AddButton"
onClick={() => {
addToBag(data)
// useAddToBag(data)
}}
onKeyDown={() => {
addToBag(data)
}}
>
<AddIcon fontSize="small" />
</div>
<div className="FavButton">
{favoriteHelpers.isProductInFavorites(product) ? (
<FavoriteIcon
fontSize="small"
style={{ fill: "red" }}
onClick={() => favoriteHelpers.removeFavorite(product)}
/>
) : (
<FavoriteIcon
fontSize="small"
style={{ fill: "gray" }}
onClick={() => favoriteHelpers.addFavorite(product)}
/>
)}
</div>
</div>
<div className="ProductCardDetails">
<div className="NameAndPrice">
<div className="ProductName">{data.name}</div>
<div className="ProductPrice">P{data.price}</div>
</div>
<div className="Description"> {data.description}</div>
</div>
<AddToBagDialog
showDialog={dialogState.showDialog}
message={dialogState.dialogMessage}
onGotoBag={() => {
setDialogState((prevState) => ({
...prevState,
showDialog: false,
}))
navigate("/bagpage")
}}
onAddMoreProducts={() => {
setDialogState((prevState) => ({
...prevState,
showDialog: false,
}))
}}
/>
<ConfirmationDialog
showDialog={confirmDialogState.showDialog}
message={confirmDialogState.dialogMessage}
onConfirm={() => {
updateBag([])
updateBag((prevState) => [...prevState, product])
setConfirmDialogState((prevState) => ({
...prevState,
showDialog: false,
}))
setDialogState((prevState) => ({
...prevState,
showDialog: true,
dialogMessage: "Product added to bag",
isError: false,
}))
}}
onDecline={() => {
setConfirmDialogState((prevState) => ({
...prevState,
showDialog: false,
}))
}}
/>
</div>
)
}
export default ProductCard
使用本地存储时,ProductList 在添加和删除收藏夹时工作正常,但在 ProductCard 上,它正在替换之前添加收藏夹时添加的那些。
这里example
【问题讨论】:
标签: reactjs react-hooks local-storage