Проблема может быть здесь src={ this.urlFetch(pic) }
Функция urlFetch
возвращает обещание вместо фактического пути к изображению или данных.
Вызовите эту функцию в componentDidMount
hook и установите изображение, которое вы получаете от бэкэнда, в состояние и используйте это свойство состояния как src
изображения.
Я вижу, что функция urlFetch
, вручную изменяющая DOM для установки образа src, это немного сбивает с толку, поскольку функция, которую вы вызываете, выполняет свою работу неявно, а изменение DOM в реакции вообще не является хорошей практикой, и var imgElem = container.getElementsByTagName('img')[0];
изменит только первое изображение, так как вы получаете первое img
в контейнере
Я бы также предложил визуализировать каждое изображение в соответствующем компоненте, объявив свойство состояния, которое будет содержать src
изображения, извлечь изображение с сервера и затем обновить состояние.
class Card extends Component {
constructor({props, token}) {
super(props, token);
this.state = {
src: ''
};
}
readResponseAsBlob = (response) => {
return response.blob();
}
showImage = (responseAsBlob) => {
this.setState({ src: URL.createObjectURL(responseAsBlob) });
}
componentDidMount() {
this.urlFetch(this.props.pic)
}
logError(error) {
console.log('Looks like there was a problem: \n', error);
}
urlFetch(data) {
fetch(data, {
headers: new Headers({
'authorization': `Bearer ${this.props.token}`,
'Content-Type': 'application/json'
})
})
.then(this.validateResponse)
.then(this.readResponseAsBlob)
.then(this.showImage)
.catch(this.logError);
}
render() {
const { src } = this.state;
return (
<a style={{width: 200, height: 250}} className='tc dib br3 ma2 pa2 grow bw2 shadow-5'>
<div id='images'>
<img style={{width: 175, height: 175: display: src ? 'block': 'none'}} className='tc myimage br3' alt='none' src={ src }/>
</div>
</a>
);
}
}