javascript - 从 Firebase 存储中检索图像以显示在组件中
问题描述
我正在尝试从我的 firebase 存储中的文件夹中检索我的图像,我尝试将 URL 存储在一个数组中,然后尝试映射并使用这些 URL 在组件中呈现它们,但我无法做到所以。我已经尝试了多次但无法弄清楚为什么,我相信这是一个尚未解决但又无法解决的承诺。当 ViewPhotos 组件加载时加载这样的 id。我会朝着完全错误的方向前进吗?
const ViewPhotos = () => {
const [imgData, setImgData] = useState([])
let getData = () => {
const storage = app.storage()
const storageRef = storage.ref('test/')
const newImg = storageRef.list()
newImg.then((res) => {
res.items.map((item)=> {
let url = item.getDownloadURL()
setImgData([...imgData, url])
})
})
}
const ListDisplay = ({ url }) => {
return (
<div>
<img src={url}/>
</div>
)
}
useEffect(() => {
getData()
},[])
return(
<div id="viewPhotos">
<h3>view photos component</h3>
<div>
{imgData.map(url => {
return <ListDisplay url={url} />
})}
</div>
</div>
)
}
解决方案
我想你快到了。该getDownloadURL()
方法还返回一个承诺,因此您需要在调用之前等待它解决setImgData
:
newImg.then((res) => {
res.items.map((item)=> {
item.getDownloadURL().then((url) => {
setImgData([...imgData, url]);
});
})
})
推荐阅读
- java - (Java) 在 Arrays.sort 中使用 lambda 作为比较器
- symfony - Symfony 4 迁移独立包返回 没有要处理的映射信息
- angular - 动态生成用户模拟数据
- java - 在 if 语句中使用 Firestore 中的布尔值
- c++ - 努力创建一个包含 std::bitset 的 Boost-Bimap
- android - 无法添加窗口 android.view.ViewRoot - 此窗口类型的权限被拒绝 - 高于 android 8.0+
- angular - Angular 发布 html 请求网址
- mongodb - 如何在数组的字段中进行 $lookup 并在同一个查询中添加外部表的内容?
- css - 如何在没有 CLI 的情况下在 Angular 组件中使用 less
- algorithm - 复发的解决办法