Доступ к нужным данным в API?
* Приношу извинения за то, что я опубликовал аналогичный вопрос ранее, но удалил его, так как этот вопрос лучше структурирован.
Здравствуйте! Я хочу нацелиться largeImageURL
из PixaBay API для рендеринга в GridTile
в моем контейнере PhotoResults. Я настроил Redux в приложении. Когда я консоль журнала this.props.photos
после подачи searchText
Я получаю массив длиной 20. Я знаю, что 0:
в 0: Array(20)
означает первую позицию индекса, но я не знаю, как это помогает мне нацеливаться largeImageURL
, Как я нацеливаюсь largeImageURL
оказывать в рамках GridTile
? Большое спасибо!
РЕДУКТОР
import * as actionTypes from '../actions/actions_index';
const photos = (state = [], action) => {
switch(action.type) {
case actionTypes.FETCH_PHOTOS:
console.log('Action received', action);
return [ action.payload.data.hits ];
default:
return state;
}
}
export default photos;
ФОТО РЕЗУЛЬТАТЫ КОНТЕЙНЕР
import React, { Component } from 'react';
import {GridList, GridTile } from 'material-ui/GridList';
import { connect } from 'react-redux';
class PhotoResults extends Component {
render() {
let photoList;
if (this.props.photos) {
photoList = (
<GridList cols={3}>
{this.props.photos.map(photo => (
<GridTile title={photo.tags} key={photo.id}>
<img src={photo.largeImageURL} alt="" />
</GridTile>
))}
</GridList>
)
} else {
photoList = null;
}
console.log(this.props.photos);
return (
<div>
{photoList}
</div>
);
}
}
const mapStateToProps = (state) => {
return { photos: state.photos };
}
export default connect(mapStateToProps, null)(PhotoResults);
1 ответ
Попробуй это. Первоначально this.props.photos будет неопределенным, поэтому перед выполнением.map необходимо выполнить условную проверку.
return(){
return(
<div>
<GridList cols={3}>
{this.props.photos && Array.isArray(this.props.photos[0]) && this.props.photos[0].length > 0 && this.props.photos[0].map(photo => (
<GridTile title={photo.tags} key={photo.id}>
<img src={photo.largeImageURL} alt="" />
</GridTile>
))}
</GridList>
</div>
)
}
Это также будет работать, но я не рекомендую, если еще в рендере
render() {
let photoList;
if (this.props.photos && Array.isArray(this.props.photos[0]) && this.props.photos[0].length > 0)
photoList = (
<GridList cols={3}>
{this.props.photos[0].map(photo => (
<GridTile title={photo.tags} key={photo.id}>
<img src={photo.largeImageURL} alt="" />
</GridTile>
))}
</GridList>
)
} else {
photoList = null;
}
console.log(this.props.photos);
return (
<div>
{photoList}
</div>
);
}