【发布时间】:2020-11-10 22:03:32
【问题描述】:
所以,我有 8 个不同的组件,其中包含有关 8 类产品(PC 组件)的数据,这些数据在描述中显然具有不同的值(核心数等)。
这 8 个组件仅包含特定数据(处理器包含核心数量,但不包含价格 - 每个组件都有价格,与类别无关)
在 product.jsx 中,我想根据 categoryName 渲染 8 个组件之一,我通过调用我在组件主体 (getCategory) 中定义的函数来获得它。但是,出于某种原因,getCategory 函数从未被评估过,也不会从该函数的控制台中打印任何 console.log。
需要指出的是,如果我只是渲染 ,则显示数据,如果第一个的比较是“处理器”===“处理器”(始终为真),则再次显示数据.
我认为我的错误在于反应逻辑。不知何故,我错过了一些关于反应如何渲染东西的东西。你能发现我使用 React 的错误吗?谢谢!
您将在下面找到相关组件的代码,但可以在此处找到完整的 repo:https://github.com/vradu007/radu-shop
import React, { useState, useEffect } from "react";
import Layout from "../../components/Layout/Layout";
import products from "../../utils/products.json";
import "./Product.css";
import { connect } from "react-redux";
import { addToCart } from "../../redux/cart/cartAction";
import { addToFavourites } from "../../redux/favourites/favouritesAction";
import { Processor, VideoCard, PowerSupply, Storage, Ram, Motherboard } from "../../utils/ProductItemsData";
const Product = (props) => {
const [product, setProduct] = useState({});
const { match } = props;
const productId = match.params.productId;
const categoryValues = Object.values(products);
//unreachable
const getCategory = () => {
categoryValues.forEach((category) => {
category.items.forEach((item)=> {
if(item.id === productId){
return category;
}
})
})
}
useEffect(() => {
const productItems = categoryValues.reduce((acc, category) => {
return [...acc, ...category.items];
}, []);
const currentProduct = productItems.find((product) => {
return Number(productId) === product.id;
});
setProduct(currentProduct);
}, [props]);
return (
<Layout>
<div className="product-page container-fluid container-min-max-width">
<h1 className="my-5 h2">{product.name}</h1>
<div className="product-info d-flex">
<div className="image-wrapper d-flex mr-5">
<img src={product.image} alt="Product presentation" />
</div>
<div className="product-details">
<p className="h3 text-danger">
{product.price} {product.currency}
</p>
<div>
<button
className="btn btn-dark mb-4 font-weight-bold"
onClick={() => {
props.addToCart({
product: {
id: product.id,
name: product.name,
price: product.price,
currency: product.currency,
image: product.image,
},
});
}}
>
Add to cart
</button>
</div>
<div>
<button
className="btn btn-dark mb-4 font-weight-bold"
onClick={() => {
props.addToFavourites({
product: {
id: product.id,
name: product.name,
price: product.price,
currency: product.currency,
image: product.image,
},
});
}}
>
Add to favourites
</button>
</div>
{
getCategory()==="processor"?
<Processor
baseFrequency={product.baseFrequency}
boostFrequency={product.boostFrequency}
cores={product.cores}
threads={product.threads}
description={product.description}
/>
: getCategory()==="video-card"?
<VideoCard
baseFrequency={product.baseFrequency}
boostFrequency={product.boostFrequency}
cores={product.cores}
threads={product.threads}
description={product.description}
/>
: getCategory()==="motherboard"?
<Motherboard
baseFrequency={product.baseFrequency}
boostFrequency={product.boostFrequency}
cores={product.cores}
threads={product.threads}
description={product.description}
/>
: getCategory()==="ram"?
<Ram
baseFrequency={product.baseFrequency}
boostFrequency={product.boostFrequency}
cores={product.cores}
threads={product.threads}
description={product.description}
/>
: getCategory()==="storage"?
<Storage
baseFrequency={product.baseFrequency}
boostFrequency={product.boostFrequency}
cores={product.cores}
threads={product.threads}
description={product.description}
/>
: getCategory()==="power-supply"?
<PowerSupply
baseFrequency={product.baseFrequency}
boostFrequency={product.boostFrequency}
cores={product.cores}
threads={product.threads}
description={product.description}
/>
: null
}
</div>
</div>
</div>
</Layout>
);
};
function mapDispatchToProps(dispatch) {
return {
addToCart: (payload) => dispatch(addToCart(payload)),
addToFavourites: (payload) => dispatch(addToFavourites(payload)),
};
}
export default connect(null, mapDispatchToProps)(Product);
【问题讨论】:
-
看起来
getCategory返回的对象不是您期望的字符串
标签: reactjs jsx conditional-operator