我正在尝试通过在youtube上关注一些讲座来开发一个类似亚马逊的网站。我创建了一个MongoDB数据库,然后通过express服务器获取数据,然后将其传递给前端react应用程序。我在控制台上检查了一下,发现获取的产品数据是正确的,redux商店也显示了产品数据,但不知何故没有显示出来。请帮帮忙。
请参考ProductScreen的代码。我尝试通过在返回语句中放入console.log ({product.name} )来进行检查。这是空白的,所以我猜问题是product没有在代码中分配给const product。
import React, { useEffect, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { Link } from 'react-router-dom';
import { detailsProduct } from '../actions/productActions';
import LoadingBox from '../components/LoadingBox';
import MessageBox from '../components/MessageBox';
import Rating from '../components/Rating';
export default function ProductScreen(props) {
const dispatch = useDispatch();
const productId = props.match.params.id;
const [qty, setQty] = useState(1);
const productDetails = useSelector((state) => state.productDetails);
const { loading, error, product } = productDetails;
useEffect(() => {
dispatch(detailsProduct(productId));
}, [dispatch, productId]);
const addToCartHandler = () => {
props.history.push(`/cart/${productId}?qty=${qty}`);
};
return (
<div>
{loading ? (
<LoadingBox></LoadingBox>
) : error ? (
<MessageBox variant="danger">{error}</MessageBox>
) : (
<div>
<Link to="/">Back to result</Link>
<div className="row top">
<div className="col-2">
<img
className="large"
src={product.image}
alt={product.name}
></img>
</div>
<div className="col-1">
<ul>
<li>
<h1>{product.name}</h1>
</li>
<li>
<Rating
rating={product.rating}
numReviews={product.numReviews}
></Rating>
</li>
<li>Pirce : ${product.price}</li>
<li>
Description:
<p>{product.description}</p>
</li>
</ul>
</div>
<div className="col-1">
<div className="card card-body">
<ul>
<li>
<div className="row">
<div>Price</div>
<div className="price">${product.price}</div>
</div>
</li>
<li>
<div className="row">
<div>Status</div>
<div>
{product.countInStock > 0 ? (
<span className="success">In Stock</span>
) : (
<span className="danger">Unavailable</span>
)}
</div>
</div>
</li>
{product.countInStock > 0 && (
<>
<li>
<div className="row">
<div>Qty</div>
<div>
<select
value={qty}
onChange={(e) => setQty(e.target.value)}
>
{[...Array(product.countInStock).keys()].map(
(x) => (
<option key={x + 1} value={x + 1}>
{x + 1}
</option>
)
)}
</select>
</div>
</div>
</li>
<li>
<button
onClick={addToCartHandler}
className="primary block"
>
Add to Cart
</button>
</li>
</>
)}
</ul>
</div>
</div>
</div>
</div>
)}
</div>
);
}
添加redux存储代码:
import { createStore, compose, applyMiddleware, combineReducers } from 'redux';
import thunk from 'redux-thunk';
import { cartReducer } from './reducers/cartReducers';
import {
productDetailsReducer,
productListReducer,
} from './reducers/productReducers';
const initialState = {
cart: {
cartItems: localStorage.getItem('cartItems')
? JSON.parse(localStorage.getItem('cartItems'))
: [],
},
};
const reducer = combineReducers({
productList: productListReducer,
productDetails: productDetailsReducer,
cart: cartReducer,
});
const composeEnhancer = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const store = createStore(
reducer,
initialState,
composeEnhancer(applyMiddleware(thunk))
);
请看截图。
发布于 2021-05-31 10:02:04
在后端的productRouter代码中有一个小错误(参见下面的代码)。...I发送的是res,而不是res.send (产品)。发送( {product }),因此我得到的json对象的格式是: productDetails { product:{product:{....}。所以,当我引用product.object时,它基本上是空的,所以我没有得到任何渲染。所以,我要么不得不使用product.product.object,要么干脆在productRouter上改正代码。
代码:
productRouter.get(
'/:id',
expressAsyncHandler(async (req, res) => {
const product = await Product.findById(req.params.id);
if (product) {
**res.send(product);**
} else {
res.status(404).send({ message: 'Product Not Found' });
}
})
);
https://stackoverflow.com/questions/67762480
复制相似问题