【发布时间】:2020-08-19 06:24:43
【问题描述】:
我有这个对象:
{
"Widget1": "notes",
"Widget2": "clock",
"Widget3": "weather",
}
它通过一个 REST API 传输到我的反应应用程序。
const Widgets: React.FC = () => {
interface DataType {
[key: string]: string;
}
const [data, setData] = React.useState<DataType>();
const [isLoaded, setIsLoaded] = React.useState<boolean>(false);
React.useEffect(() => {
const fetchData = async () => {
fetch("http://localhost:1202/data")
.then((res) => res.json())
.then((json) => {
setData(json);
console.log("json", json);
});
};
fetchData();
setIsLoaded(true);
}, []);
const [currentWidget1, setCurrentWidget1] = React.useState<string>("wetter");
const widget1Handler = (widget: string) => {};
if (!isLoaded) {
return (
<div>loading...<div>
);
} else {
return (
<component data={data}></component>
);
}
};
export default Widgets;
问题是显然setData 的更新时间比setIsLoaded 的更新时间要长。
所以component是在数据存储到数据对象之前加载的。
有没有快速解决办法?
【问题讨论】:
-
fetch是异步的,因此其行之后的同步代码将立即执行,有时稍后,fetch的承诺将解决(或拒绝)并且setData将被调用. -
也就是说,您可能只使用
data进行检查并删除isLoaded。if (!data) return <div>loading...<div>;
标签: javascript reactjs async-await