reactjs - 渲染前等待多个组件的异步调用
问题描述
有一个带有 X 子组件的父组件做出反应。每个组件(包括父组件)执行未知持续时间的异步调用。完成所有异步调用后,有没有办法协调渲染?
我的问题的简单示例:
理想的解决方案:所有数字同时出现。
我知道我可以将所有异步调用从子级移到父级。我不喜欢的是我只需要特定孩子的数据......
我想过将孩子们的承诺返回给父母,并Promise.all()
在所有承诺都解决后使用设置一个布尔值。但我无法让它工作。这种方法通常是一个“好主意”吗?是否有其他方法可以在不移动异步调用的情况下解决它?
更新:
根据@zero298 的要求,代码示例(查看 CodeSandbox 以获得更详细的示例):
import React, { useEffect, useState } from "react";
import ReactDOM from "react-dom";
function getRandomInt(max) {
return Math.floor(Math.random() * Math.floor(max));
}
async function fetchData(setState) {
const wait = getRandomInt(5);
await new Promise(resolve => setTimeout(resolve, wait * 1000));
setState(wait);
}
function Tile() {
const [title, setTitle] = useState("");
useEffect(() => {
fetchData(setTitle);
}, []);
return <div>{title}</div>;
}
function App() {
const [title, setTitle] = useState("");
useEffect(() => {
fetchData(setTitle);
}, []);
return (
<div>
<div>{title}</div>
<Tile />
<Tile />
<Tile />
<Tile />
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
解决方案
推荐阅读
- elasticsearch - 使用 CloudID、用户名和密码连接到 Elasticsearch
- sql-server - 将多个具有关系的 EXCEL 文件(Vlookup)导入 MS SQL Server
- android - 如何阻止相同的广播(来自 PendingIntent)排队?
- amazon-web-services - amazon s3 预签名的 url 应该使用新的访问密钥辞职
- javascript - 将数组传递给 JavaScript 显示为 Object
- java - jhipster为什么不更新
- html - 使用 css 反映 svg
- android - Firebase 验证 Id 令牌,但客户端尚未准备好,所以我不知道来自客户端的数据包含
- css-selectors - DomCrawler 第二个等孩子
- node.js - 为什么我的节点 js express 应用程序不能保持活动状态?