#reactjs #typescript #react-masonry
Вопрос:
У меня есть список URL-адресов, я хочу получить их все и вернуть изображения, найденные во всех этих API, чтобы я мог отобразить их в компоненте react, используя react-responsive-masonry. Я создал свою функцию в javascript, но я не уверен, как написать ее в машинописном виде, а также я не знаю, как отобразить ее в моем компоненте. Вот моя функция
var photos_info = [];
async function get_photos(urls) {
var promises = urls.map((url) => fetch(url).then((y) => y.json()));
await Promise.all(promises).then((results) => {
photos_info = results;
return photos_info;
});
return photos_info;
}
Я хочу отобразить его в src в своем компоненте
<ResponsiveMasonry columnsCountBreakPoints={columnsCountBreakPoints}>
<Masonry gutter={4}>
{
<img src={} />
}
</Masonry>
</ResponsiveMasonry>
Редактировать
Другой метод, использующий useState и useEffect
const [photosList, setPhotosList] = useState<any>();
useEffect(() => {
const photosPromises = urls.map((url) =>
fetch(url).then((res) => res.json())
);
Promise.all(photosPromises).then((data) => {
setPhotosList(data);
});
}, []);
console.log("hi", photosList);
Я попытался изобразить простой, просто чтобы посмотреть, что внутри
<div>
{photosList.map((photo: any) => {
return <pre>{JSON.stringify(photo)}</pre>;
})}
</div>
но это дает мне эту ошибку, не удается прочитать свойство «карта» неопределенного
Комментарии:
1. Ваш код для вызова API выглядит в основном хорошо, если не считать того факта, что вы можете просто
return Promise.all
и не нуждаетесь в другом.then()
в этой строке. Я думаю, что ваша проблема может заключаться в том, как вы можете выполнять асинхронные действия в своем компоненте react, и ответ на это, вероятно, простоuseEffect
?2. Предполагая, что вы используете функциональный компонент, я бы посоветовал вам найти учебник, в котором объясняется, как обрабатывать вызовы API с помощью useEffect и useState.
3. Спасибо, я поищу об эффекте использования.
4. @Evert, вы можете проверить редактирование. теперь, когда я console.log(photosList), он печатается дважды, один неопределенный, а другой-массив, я не знаю, как этого избежать, а также я не знаю, как зацикливаться на PhotosList, так как это дает мне ошибку, что он не определен.
5. Ваш компонент один раз визуализирует пустые данные, а затем еще долго после этого обещание разрешается и вызывает setPhotosList. Ваш компонент должен проверить наличие пустого регистра данных и отобразить состояние загрузки или пустоты, или вы должны инициировать состояние в пустом массиве
useState([])
, если предпочитаете