Firebase 存储:将图像下载并放入 React 地图中的 img src

IT技术 javascript reactjs firebase firebase-storage
2021-04-13 22:36:02

我正在尝试映射数组以从 Firebase 存储中获取图像 url 并将它们列出到页面。代码给了我一个 url,但问题是代码没有img按时将 url 设置为变量并返回空img变量。

return(
    <div>
        <Header />
        {this.state.loaded ? <Loading /> : null}
        <div>
            {this.state.productsArr.map((product, i) => {
                let img = '';
                storageRef.child(`images/${product.images[0]}`)
                                        .getDownloadURL()
                                        .then((url) => {
                                            img = url
                                            console.log('then img', img)
                                        })
                                        .catch((err) => console.log(err))
                console.log('result',img)

                return(
                    <div key={i}>
                        <div>
                            <div>
                                <img src={img}
                                    alt={product.category} 
                                />
                            </div>
                        </div>
                    </div>
                )
            })}
        </div>
        <Footer />
    </div>
)

我哪里做错了?也得到两次结果。

1个回答

调用getDownloadURL()意味着 SDK 必须调用服务器来获取该 URL。当该调用从带有下载 URL 的服务器返回时,它<img src={img}已经运行很久了。

因此,您需要将下载 URL 存储在状态中,然后在渲染方法中使用状态中的 URL。

您通常会开始在您的componentWillMount方法中加载数据

componentWillMount() {
    let promises = this.state.productsArr.map((product, i) => {
        return storageRef.child(`images/${product.images[0]}`).getDownloadURL();
    });
    Promise.all(promises).then((downloadURLs) => {
        setState({ downloadURLs });
    });
}

当你调用setState()React 时,它会自动重新渲染依赖于修改状态的 UI 部分。因此,在您的渲染方法中,您将使用来自state.downloadURLs.

感谢弗兰克的回答,我认为你的解决方案是正确的,但我只是想知道是否有直接在组件渲染中工作的解决方案
2021-05-30 22:36:02