从 Reactjs 中的 Firebase 存储返回图像
Returning an image from Firebase storage within Reactjs
我有一个功能可以从 Firebase 存储中检索图像:
import {
getStorage,
ref,
getDownloadURL
} from 'firebase/storage';
const storage = getStorage();
export async function getImage(location) {
const ImageURL = await getDownloadURL(ref(storage, location));
return await ImageURL;
}
然后在 React 组件中调用:
import { getImage } from 'API/Storage/getImage';
const EventPage = (props) => {
return (
<div>
<img src={getImage('image.jpg')}
</div>
);
}
export default EventPage;
但是图像没有显示,而是显示:<img src="[object Promise]" alt="Show Image">
解决诺言的最佳方式是什么? getImage
函数 returns 中的控制台日志记录 ImageURL
符合预期 URL。
您需要等待承诺解决。您可以在 useEffect
and store the value in a useState
.
中获取数据
这是一个基本示例:
import { getImage } from 'API/Storage/getImage';
const EventPage = (props) => {
const [image, setImage] = useState();
useEffect(async () => {
const image = await getImage('image.jpg');
setImage(image);
}, []);
return (
<div>
{image ? <img src={image} /> : "Loading image"}
</div>
);
}
export default EventPage;
上例中的 useEffect
没有考虑到您的组件在卸载的同时仍在获取数据的情况。考虑到这一点的实现如下所示:
useEffect(() => {
let wasUnmounted = false;
getImage('image.jpg').then((image) => {
if (wasUnmounted) return;
setImage(image);
});
return () => {
wasUnmounted = true;
};
}, []);
请注意,提供给 useEffect
的回调不是 async
。那是因为 async
实现了 return 一个承诺。为了能够检测到组件已卸载,我们需要 return 回调(它将在组件卸载时调用,因为空数组作为第二个参数传递)。请在此处阅读有关 useEffect
的更多信息:https://reactjs.org/docs/hooks-reference.html#useeffect
我有一个功能可以从 Firebase 存储中检索图像:
import {
getStorage,
ref,
getDownloadURL
} from 'firebase/storage';
const storage = getStorage();
export async function getImage(location) {
const ImageURL = await getDownloadURL(ref(storage, location));
return await ImageURL;
}
然后在 React 组件中调用:
import { getImage } from 'API/Storage/getImage';
const EventPage = (props) => {
return (
<div>
<img src={getImage('image.jpg')}
</div>
);
}
export default EventPage;
但是图像没有显示,而是显示:<img src="[object Promise]" alt="Show Image">
解决诺言的最佳方式是什么? getImage
函数 returns 中的控制台日志记录 ImageURL
符合预期 URL。
您需要等待承诺解决。您可以在 useEffect
and store the value in a useState
.
这是一个基本示例:
import { getImage } from 'API/Storage/getImage';
const EventPage = (props) => {
const [image, setImage] = useState();
useEffect(async () => {
const image = await getImage('image.jpg');
setImage(image);
}, []);
return (
<div>
{image ? <img src={image} /> : "Loading image"}
</div>
);
}
export default EventPage;
上例中的 useEffect
没有考虑到您的组件在卸载的同时仍在获取数据的情况。考虑到这一点的实现如下所示:
useEffect(() => {
let wasUnmounted = false;
getImage('image.jpg').then((image) => {
if (wasUnmounted) return;
setImage(image);
});
return () => {
wasUnmounted = true;
};
}, []);
请注意,提供给 useEffect
的回调不是 async
。那是因为 async
实现了 return 一个承诺。为了能够检测到组件已卸载,我们需要 return 回调(它将在组件卸载时调用,因为空数组作为第二个参数传递)。请在此处阅读有关 useEffect
的更多信息:https://reactjs.org/docs/hooks-reference.html#useeffect