javascript - 如何在功能组件中渲染 DATA 之前等待 FETCH?
问题描述
我试图显示一个<Loading>
组件,直到 DATA 获取成功,
然后我显示一个子组件。我不明白为什么状态没有更新......
我该如何处理?
我正在使用react-admin
,但我猜这并不重要。
我有一个<Dashboard>
应该传递defibs (Array)
给<DefibsCard>
.
当我登录defibs
时,<DefibsCard>
我有一个空数组。谢谢 !
const Dashboard = () => {
const dataProvider = useDataProvider();
const [loading, setLoading] = useState(true);
const [defibs, setDefibs] = useState([]);
const fetchDefibs = () => {
dataProvider.getList('defibrillateurs', {
filters: {}, sort: {field: 'id', order: 'ASC'}, pagination: {page: 1, perPage: 10}
}).then((response) => {
setDefibs(response.defibs);
setLoading(false);
})
}
useEffect(() => {
fetchDefibs();
console.log(loading)
}, [])
const classes = useStyles();
return (!defibs
? <Loading />
: <div className={classes.flex}>
<div className={classes.leftCol}>
<div className={classes.flexColumn}>
// ...
<div className={classes.flex}>
<DefibsCard defibs={defibs}/> // Child component
<AlertsCard />
</div>
</div>
</div>
// ...
</div>);
};
解决方案
我确实有旧反应的经验
所以我可以建议你这些chanfes
useEffect(() => {
setLoading(true); // here
fetchDefibs();
console.log(loading)
}, [])
然后
const fetchDefibs = () => {
dataProvider.getList('defibrillateurs', {
filters: {},
sort: {field: 'id', order: 'ASC'},
pagination: { page: 1, perPage: 10 }
}).then((response) => {
setLoading(false); // here
setDefibs(response.defibs)
setLoading(false);
}).catch( e => setLoading(false);)
}
然后
return(
{!loading ? <Loading />
:
<div className={classes.flex}>
<div className={classes.leftCol}>
<div className={classes.flexColumn}>
<Card>
<CardHeader title="Welcome to the administration" />
<CardContent>Lorem ipsum sic dolor amet...</CardContent>
</Card>
......
}
当您使用{ defibs &&
它时,它将始终为真,因为您已初始化它,如果它是或并且使用 不是最好的方法,则[]
它只会是假的,就像数据库返回长度为 0 的数组然后对您的应用程序将显示加载undefined
null
defibs && defibs.length = 0
[]
推荐阅读
- css - 在标签之间放置间距
- opencv - 使用 JavaCV 获取视频旋转元数据值
- python - 使用配对索引键连接两个数据帧
- php - 同一个变量似乎在 PHP 代码的不同部分具有不同的值
- r - R中带有传单(mapview)的地图顶部的鼠标坐标信息
- java - 在 Spring Boot 测试中测试 @Cacheable:未在 MockBean 上调用咖啡因缓存
- javascript - 为什么在我的 pong JavaScript 画布游戏中球不能完全反弹?
- java - Jackson 在 Android 上按字母顺序对 JSON 序列化输出键进行排序
- python - 将数据复制到缓冲区(字节数组)
- xamarin.forms - 将位图保存到图库并通过本地通知访问它