У меня проблемы с отображением данных с помощью ReactJS.
Я могу получать данные из API и перебирать каждый объект, чтобы отобразить каждый «продукт». Все тринадцать (13) продуктов отображаются на моей странице, но каждый элемент отображается на отдельной странице (всего 13 страниц), а не на 1 странице (имеет ли это смысл?). Как мне сделать так, чтобы все «продукты» отображались на одной странице (в списке), а не создавать новую страницу (с верхним и нижним колонтитулами) для каждого продукта?
Я не знаю, как лучше объяснить эту проблему. Прошу прощения за постановку вопроса.
Мой код ниже:
class Top_Sellers extends Component {
constructor(props) {
super(props);
this.state = {
products: [],
attributes: {}
};
}
componentDidMount() {
fetch("http://www.msaironline.com/qa1/api/product.php?type=top")
.then(results => {
return results.json();
})
.then(data => {
let products = data.product.map(pic => {
console.info(pic);
let item = 0;
while (item < pic.length) {
item++;
}
return (
<div>
<div className = "content-area-container">
<div className = "top-sellers">
<h1>TOP SELLERS</h1>
</div>
<div className = "row">
<div className = "product_listing">
<div className = "product_entry">
<div className = "product-image">
<img src = {pic.icon} alt = "product-placeholder" />
</div>
<p>{pic.prodID}</p>
<div className = "product-details">
<h4 className = "product-title">
<a href = "/product_pages/prodID409">{pic.prodName}</a>
</h4>
<h6 className = "product-brand-name">{pic.brandName}</h6>
<h6 className = "product-suggested-retail-price">
${pic.msrp}
</h6>
<h6 className = "product-savings">
Savings: <strong>${pic.msrp - pic.prodPrice}</strong>
</h6>
<h6 className = "product-actual-price">
<strong>${pic.prodPrice}</strong>
</h6>
</div>
</div>
</div>
</div>
<div className = "FooterLinks1">
<HelpAndCurrency />
</div>
<div className = "FooterLinks2">
<AboutLinks />
</div>
</div>
<div className = "about-footer">
<div className = "terms">
<p>
<a href = "/terms" target = "_blank" rel = "noopener noreferrer">
Terms of Use
</a>
|
<a
href = "/privacy"
target = "_blank"
rel = "noopener noreferrer"
>
Privacy Policy
</a>
</p>
</div>
<div className = "copyright">
<p>
© 2018 - MS Air, Inc. | <Link to = "/">Home</Link>
</p>
</div>
</div>
</div>
);
});
this.setState({ products: products });
console.info("state", this.state.products);
});
}
render() {
return (
<div className = "container2">
<div className = "container1">{this.state.products}</div>
</div>
);
}
}
export default Top_Sellers;



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


data.product.map создает целый элемент упаковки для каждого продукта.
Нанесите на карту продукты, чтобы создать список элементов <div className = "row">, и это должно исправить это.
Я также рекомендую предложение @ Tholle об использовании состояния и выполнении работы в render вместо того, чтобы делать все внутри componentDidMount.
Вот упрощенный пример с рекомендуемыми изменениями:
const getData = () => {
return Promise.resolve([
{ id: '1', name: 'Product 1'},
{ id: '2', name: 'Product 2'},
{ id: '3', name: 'Product 3'}
])
}
class Top_Sellers extends Component {
constructor(props) {
super(props);
this.state = {
products: []
};
}
componentDidMount() {
getData()
.then(data => {
this.setState({ products: data });
});
}
render() {
return (
<div>
<div className = "content-area-container">
<div className = "top-sellers">
<h1>TOP SELLERS</h1>
</div>
{this.state.products.map((product) => (
<div className = "row" key = {product.id}>
<h4 className = "product-title">
<a href = "/product_pages/prodID409">{product.name}</a>
</h4>
</div>
))}
<div className = "FooterLinks1">
<div>help and currency</div>
</div>
<div className = "FooterLinks2">
<div>about links</div>
</div>
</div>
<div className = "about-footer">
about footer
</div>
</div>
);
}
}
Спасибо за вашу помощь! Я все еще новичок в этом ... не могли бы вы показать мне, как я бы это сделал? Каждый раз, когда я перемещаю что-либо в этом коде, оно ломается.
@ J.Patterson Я добавил упрощенный пример, дайте мне знать, поможет ли это
Вам следует разделить свой продукт на другой компонент. Как это,
import React, { Component } from 'react';
const Product = (pic) => {
return (
<div>
<div className = "content-area-container">
<div className = "top-sellers">
<h1>TOP SELLERS</h1>
</div>
<div className = "row">
<div className = "product_listing">
<div className = "product_entry">
<div className = "product-image">
<img
src = {pic.icon}
alt = "product-placeholder"
/>
</div>
<p>{pic.prodID}</p>
<div className = "product-details">
<h4 className = "product-title">
<a href = "/product_pages/prodID409">
{pic.prodName}
</a>
</h4>
<h6 className = "product-brand-name">
{pic.brandName}
</h6>
<h6 className = "product-suggested-retail-price">
${pic.msrp}
</h6>
<h6 className = "product-savings">
Savings:{' '}
<strong>
${pic.msrp -
pic.prodPrice}
</strong>
</h6>
<h6 className = "product-actual-price">
<strong>
${pic.prodPrice}
</strong>
</h6>
</div>
</div>
</div>
</div>
</div>
</div>
)
}
class Top_Sellers extends Component {
constructor(props) {
super(props);
this.state = {
products: [],
attributes: {}
};
}
componentDidMount() {
fetch('http://www.msaironline.com/qa1/api/product.php?type=top')
.then(results => {
return results.json();
})
.then(data => {
this.setState({ products: data.product });
});
}
render() {
return (
<div className = "container2">
<div className = "container1">{this.state.products.map(pic => <Product pic = {pic} key = {pic.prodId}/>)}</div>
<div className = "FooterLinks1">
<HelpAndCurrency />
</div>
<div className = "FooterLinks2">
<AboutLinks />
</div>
<div className = "about-footer">
<div className = "terms">
<p>
<a
href = "/terms"
target = "_blank"
rel = "noopener noreferrer"
>
Terms of Use
</a>
|
<a
href = "/privacy"
target = "_blank"
rel = "noopener noreferrer"
>
Privacy Policy
</a>
</p>
</div>
<div className = "copyright">
<p>
© 2018 - MS Air, Inc. |{' '}
<Link to = "/">Home</Link>
</p>
</div>
</div>
</div>
);
}
}
export default Top_Sellers;
И не забудьте добавить key = {/*someUnique stuff*/} на вашу карту. Это может улучшить реакцию.
Просто выполните сетевой запрос в
componentDidMountи используйтеthis.setState({ products: products }), когда запрос будет выполнен. Затем вместо этого извлеките JSX из состояния в методе рендеринга.