我正在从 Firebase Cloud Firestore 中提取 .map 中的帖子列表。我还有与每篇帖子相关的照片,我使用post.title + '.jpg'Cloud Storage 中的 来获取它们。帖子标题提取效果很好,但使用 时fetchImage它不会显示在帖子中。它显示在 console.log 中。我也可以从控制台访问 url,所以那里没有问题。
post.title + '.jpg'
fetchImage
有任何想法吗?
{this.state.posts.map((post, i) => { let fetchImage firebase .storage() .ref(post.title + '.jpg') .getDownloadURL() .then((url) => { console.log(url) fetchImage = url; }); return ( <Text>{post.title}</Text> <Image style={styles.image} source={{ uri: fetchImage }} /> )} )}
您遇到的问题是由于从 Firebase 存储中获取图像的异步特性造成的。getDownloadURL调用时,它会返回一个承诺,并且分配fetchImage = url在组件已经渲染之后发生。这就是在初始渲染期间fetchImage保留的原因。undefined
getDownloadURL
fetchImage = url
undefined
为了解决这个问题,您可以使用 React 状态来存储获取的 URL。获取 URL 后,您可以更新状态,从而触发使用更新后的图像 URL 重新渲染组件。
以下是实现此目的的方法:
这是您的代码的更新版本:
import React, { useState, useEffect } from 'react'; import { View, Text, Image, StyleSheet } from 'react-native'; import firebase from 'firebase/app'; import 'firebase/storage'; import 'firebase/firestore'; const MyComponent = () => { const [posts, setPosts] = useState([]); const [imageUrls, setImageUrls] = useState({}); useEffect(() => { const fetchPosts = async () => { const postsSnapshot = await firebase.firestore().collection('posts').get(); const postsData = postsSnapshot.docs.map(doc => doc.data()); setPosts(postsData); const urls = {}; for (const post of postsData) { const url = await firebase.storage().ref(post.title + '.jpg').getDownloadURL(); urls[post.title] = url; } setImageUrls(urls); }; fetchPosts(); }, []); return ( <View> {posts.map((post, i) => ( <View key={i}> <Text>{post.title}</Text> {imageUrls[post.title] && ( <Image style={styles.image} source={{ uri: imageUrls[post.title] }} /> )} </View> ))} </View> ); }; const styles = StyleSheet.create({ image: { width: 100, height: 100, }, }); export default MyComponent;
posts
imageUrls
useEffect
Image
这种方法可确保组件在获取的图像 URL 可用时重新渲染,从而正确显示图像。