我试图在从API获取数据时显示一个加载微调器,并在使用useEffect完成后显示错误或结果。由于某种原因,isLoading
在获取完成前被设置为false。
你能告诉我到底出了什么问题吗?
const ProblemTable: React.FC<IProblemTableProps> = (props) => {
// List of problems to show on the table
const [problems, setProblems] = useState<IProblem[]>([]);
const [isLoading, setIsLoading] = useState<boolean>(true);
const [error, setError] = useState<Error>();
useEffect(() => {
TierService.getProblems(props.tier, setProblems, setError);
}, []);
useEffect(() => {
setIsLoading(false);
}, [problems, error]);
if (isLoading) {
return <Loading message="Loading problems..." />;
}
if (error) {
return <ErrorMessage title="Failed fetching problems" />;
}
return <>...</>;
1条答案
按热度按时间c3frrgcw1#
在组件装载时调用将加载设置为
false
的useEffect
。添加一个条件,仅在API调用结束时将加载设置为false
。例如,如果出现任何问题或错误,请将加载设置为
false
:但是,如果没有问题或错误,
loading
将保持true
,因此您可能需要一个更严格的条件。更好的方法是,如果调用了任何回调函数,则将loading设置为false
:根据
TierService.getProblems
的实现,如果在响应为空时没有调用回调,则第二个建议将失败。我可能会创建一个基于Promise的API,它允许您将
async/await
与try/catch/finally
一起使用: