Нужно вывести на страницу несколько элементов из одного массива React
Я с помощью метода fetch отправляю запрос, получаю ответ, обрабатываю его и у меня остается массив объектов, в котором хранится информация по фильмам. Все эти фильмы мне нужно вывести на страницу в виде карточки. Вот мой код:
export default class CardMovie extends Component {
state = {
image: null,
originalTitle: null,
date: null,
genres: null,
overview: null,
}
async componentDidMount() {
await fetch('https://api.themoviedb.org/3/search/movie?api_key=b14771c0adfdc54f59204d41d5bf2302&query=return')
.then(resp => resp.json())
.then(rez => rez.results[0])
.then(elem => {
this.setState({
image: `https://image.tmdb.org/t/p/w500${elem.poster_path}`,
originalTitle: elem.original_title,
date: format(new Date(elem.release_date), 'PP'),
genres: 'genres',
overview: this.shortText(elem.overview, 210, '...'),
})
})
}
shortText(longText, maxLength, postfix) {
const pos = longText.indexOf(" ", maxLength);
return (pos === -1 ? longText : longText.substr(0, pos) + postfix);
}
newCard() {
const { image, originalTitle, date, overview, genres } = this.state;
const { Title, Text } = Typography;
return (
<Row className='cardStyle'>
<Col className='gutter-row' span={12}>
<Image
src={image}
/>
</Col>
<Col className='gutter-row' span={1} />
<Col className='gutter-row' span={10}>
<Title level={5}>{originalTitle}</Title>
<Text disabled>{date}</Text> <br />
<Text keyboard type="secondary">{genres}</Text>
<Text>
<p className='overview'>{overview}</p>
</Text>
<Col className='gutter-row' span={1} />
</Col>
</Row>
)
}
render() {
return (
<div>
{ this.newCard() }
</div>
)
}
}
Код рабочий, ошибок нет. Но на страницу рендерится только последний фильм, сколько бы карточек я не отображала
Подскажите, пожалуйста, в чем ошибка?
Ответы (1 шт):
Автор решения: Александр
→ Ссылка
Вы передаете в state только первый фильм .then(rez => rez.results[0])
вы можете передать все, и в рендере к массиву применить .map и на каждой итерации делать рендер карточки фильма, соответственно передавая параметры для рендера через аргументы. Как тут:
newCard(movie) {
const { image, originalTitle, date, overview, genres } = movie;
...код
}
Ну и весь код
class CardMovie extends React.Component {
state = {
movies: []
};
async componentDidMount() {
await fetch("https://api.themoviedb.org/3/search/movie?api_key=b14771c0adfdc54f59204d41d5bf2302&query=return"
)
.then((resp) => resp.json())
.then((rez) => this.setState({ movies: rez.results }));
}
shortText(longText, maxLength, postfix) {
const pos = longText.indexOf(" ", maxLength);
return pos === -1 ? longText : longText.substr(0, pos) + postfix;
}
newCard(movie) {
const { image, originalTitle, date, overview, genres } = movie;
const { Title, Text } = Typography;
return (
<Row className="cardStyle">
<Col className="gutter-row" span={12}>
<Image src={image} />
</Col>
<Col className="gutter-row" span={1} />
<Col className="gutter-row" span={10}>
<Title level={5}>{originalTitle}</Title>
<Text disabled>{date}</Text> <br />
<Text keyboard type="secondary">
{genres}
</Text>
<Text>
<p className="overview">{overview}</p>
</Text>
<Col className="gutter-row" span={1} />
</Col>
</Row>
);
}
render() {
const {movies} = this.state;
return (
<div>
{movies.map(movie => (
this.newCard(movie)
))}
</div>
)
}
}