请使用 fetch 从 API 获取数据,但只有 JSX return 没有产品。 Api 来自:http://fakestoreapi.com/docs
Please I'm using fetch to get data from an API, but only the JSX return without the products. Api is from: http://fakestoreapi.com/docs
请我的代码只是 returns JSX 而没有来自 API 的内容。
当我 console.log 时,我尝试使用 fetch(),我看到了产品数组。我的问题是如何从 API.
输出这些产品
请帮我调试,我尝试了不同的方法,但我一直都在这一点上。谢谢。
Product.js 文件
import React, { useEffect, useState } from "react";
const Products = () => {
const [products, setProducts] = useState([]);
const [loading, setLoading] = useState(false);
const { title, image, price, category } = products;
useEffect(() => {
getProducts();
// eslint-disable-next-line
}, []);
const getProducts = async () => {
setLoading(true);
const res = await fetch("https://fakestoreapi.com/products");
const data = await res.json();
setProducts(data);
setLoading(false);
console.log(data);
};
if (loading) {
return <h4>Loading.....</h4>;
}
return (
<div>
{!loading && products.length === 0 ? (
<p className='center'>No logs to show....</p>
) : (
products.map((product) => (
<div class='card' style={{ width: "18rem" }} key={products.id}>
<img src={image} class='card-img-top' alt='...' />
<div class='card-body'>
<h5 class='card-title'>Card title</h5>
<p class='card-text'>
Some quick example text to build on the card title and make up
the bulk of the card's content.
</p>
</div>
<ul class='list-group list-group-flush'>
<li class='list-group-item'>{title}</li>
<li class='list-group-item'>$ {price}</li>
<li class='list-group-item'>{category}</li>
</ul>
<div class='card-body'>
<a href='#' class='card-link'>
Card link
</a>
<a href='#' class='card-link'>
Another link
</a>
</div>
</div>
))
)}
</div>
);
};
export default Products;
我也不知道。但这对我有用。
products.map(({ title, image, price, category }, index) => (
<div key={index} class='card' style={{ width: "18rem" }} key={products.id}>
<img src={image} class='card-img-top' alt='...' />
<div class='card-body'>
<h5 class='card-title'>Card title</h5>
<p class='card-text'>
Some quick example text to build on the card title and make up
the bulk of the card's content.
</p>
</div>
<ul class='list-group list-group-flush'>
<li class='list-group-item'>{title}</li>
<li class='list-group-item'>$ {price}</li>
<li class='list-group-item'>{category}</li>
</ul>
<div class='card-body'>
<a href='#' class='card-link'>
Card link
</a>
<a href='#' class='card-link'>
Another link
</a>
</div>
</div>
))
)}
您需要在地图功能中添加{ title, image, price, category }
。我想是因为map函数不知道什么是{ title, image, price, category }
变量,每次使用map函数都要加一个key,别忘了把class=
改成className
.
您只需使用 product?.title ,product?.price,product?.category
即可访问各个字段。
这种方法优于其他方法,因为您不会收到不在 API.
中的字段的错误
您必须首先解构您尝试在 JSX 中使用的属性(标题、价格、类别),然后才能显示它们。
products.map((product) => {
const { title, price, category } = product;
return (****your JSX goes here***)})
请我的代码只是 returns JSX 而没有来自 API 的内容。 当我 console.log 时,我尝试使用 fetch(),我看到了产品数组。我的问题是如何从 API.
输出这些产品请帮我调试,我尝试了不同的方法,但我一直都在这一点上。谢谢。
Product.js 文件
import React, { useEffect, useState } from "react";
const Products = () => {
const [products, setProducts] = useState([]);
const [loading, setLoading] = useState(false);
const { title, image, price, category } = products;
useEffect(() => {
getProducts();
// eslint-disable-next-line
}, []);
const getProducts = async () => {
setLoading(true);
const res = await fetch("https://fakestoreapi.com/products");
const data = await res.json();
setProducts(data);
setLoading(false);
console.log(data);
};
if (loading) {
return <h4>Loading.....</h4>;
}
return (
<div>
{!loading && products.length === 0 ? (
<p className='center'>No logs to show....</p>
) : (
products.map((product) => (
<div class='card' style={{ width: "18rem" }} key={products.id}>
<img src={image} class='card-img-top' alt='...' />
<div class='card-body'>
<h5 class='card-title'>Card title</h5>
<p class='card-text'>
Some quick example text to build on the card title and make up
the bulk of the card's content.
</p>
</div>
<ul class='list-group list-group-flush'>
<li class='list-group-item'>{title}</li>
<li class='list-group-item'>$ {price}</li>
<li class='list-group-item'>{category}</li>
</ul>
<div class='card-body'>
<a href='#' class='card-link'>
Card link
</a>
<a href='#' class='card-link'>
Another link
</a>
</div>
</div>
))
)}
</div>
);
};
export default Products;
我也不知道。但这对我有用。
products.map(({ title, image, price, category }, index) => (
<div key={index} class='card' style={{ width: "18rem" }} key={products.id}>
<img src={image} class='card-img-top' alt='...' />
<div class='card-body'>
<h5 class='card-title'>Card title</h5>
<p class='card-text'>
Some quick example text to build on the card title and make up
the bulk of the card's content.
</p>
</div>
<ul class='list-group list-group-flush'>
<li class='list-group-item'>{title}</li>
<li class='list-group-item'>$ {price}</li>
<li class='list-group-item'>{category}</li>
</ul>
<div class='card-body'>
<a href='#' class='card-link'>
Card link
</a>
<a href='#' class='card-link'>
Another link
</a>
</div>
</div>
))
)}
您需要在地图功能中添加{ title, image, price, category }
。我想是因为map函数不知道什么是{ title, image, price, category }
变量,每次使用map函数都要加一个key,别忘了把class=
改成className
.
您只需使用 product?.title ,product?.price,product?.category
即可访问各个字段。
这种方法优于其他方法,因为您不会收到不在 API.
您必须首先解构您尝试在 JSX 中使用的属性(标题、价格、类别),然后才能显示它们。
products.map((product) => {
const { title, price, category } = product;
return (****your JSX goes here***)})