javascript - 在 React 中向用户呈现任何内容之前,如何从 API 或 Firebase 检索数据?
问题描述
我想从 Firebase 检索数据,然后将其更新为 redux 并将其呈现给用户。我们可以有条件渲染App.js
吗?
如果在(组件)中检索数据HomePage.js
并将其更新为 redux 并显示它。然后当用户导航到另一个页面Orders.js
或者MyProfile.js
我从 redux 获取数据时使用useSelector
并显示它。但是,如果用户访问 aOrders.js
或MyProfile.js
first ,则由于用户没有访问,因此尚未检索到数据HomePage.js
。
我现在可以在 App.js 中检索数据并使用条件渲染通过渲染加载屏幕来阻止用户查看其他屏幕。这是一个好习惯吗?
如何在向用户呈现任何内容之前为所有页面普遍获取数据?希望我把问题说清楚了。
解决方案
通常,最好的做法是不管数据是否准备好都加载页面。但是,如果数据尚未准备好,请显示skeleton
类似于以下内容的页面:
然后在useEffect
钩子中获取数据并setState
在收到数据后执行一次。之后,显示预期的组件。
例如
const Videos = () => {
const [videos, setVideos] = useState(new Array(5));
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch('/api/videos')
.then(response => response.json())
.then(videos => setVideos(videos))
.finally(() => setLoading(false))
}, []);
return (
<Container>
{videos.map(video => loading
? <Skeleton />
: <Video video={video} />
)}
</Container>
);
};
注意,即将到来的并发模式(还没有 ETA,但已经讨论了很长时间)。这种做法将发生巨大变化。
推荐阅读
- pdf - 带有 TSA 时间戳的数字签名在 TSA 响应 PDF 框中添加链中证书,给出错误“没有足够的空间来写入签名”
- javascript - 属性数据不为空时的jQuery选择器
- debugging - 从 Specflow 2 升级到 3.5.5 后无法调试步骤文件
- excel - 如何将数据从一个工作簿复制到另一个工作簿?
- javascript - 为什么有些对象没有在这个 .splice() 中被删除,而有些对象是?
- python - SQLite UPDATE 命令不更新数据库
- jquery - jQuery如果不存在则添加css
- c++ - Gnuplot 和 std::filesystem::remove
- electron - 我如何为 linux 打包一个电子应用程序?
- azure - Azure Blobs C# 客户端 - 使用多个过滤器服务器端