对接受 API 调用的组件做出反应悬念?

React suspense for component that takes an API call?

提问人:jNiuk 提问时间:11/17/2023 更新时间:11/17/2023 访问量:24

问:

我希望根据 API 调用呈现标头。在 API 返回数据之前,它是未定义的。我的渲染图如下所示:

const LazyHeader = async () => {
  const data = await fetchCampaignHeaderData({ client });
  return <CampaignHeader data={data} />;
};

<Suspense fallback={<SkeletonHeader />}>
  <LazyHeader />
</Suspense>

这有效,尽管我收到 4 个关于错误请求 (400) 和无效 JSON 的错误。如果我将其切换到 useEffect 和 useState 的旧方法,则不会出现这些错误。旧方法:

useEffect(() => {
 (async () => {
   Promise.all([fetchCampaignHeaderData({ client })]).then(async (data) => {
     const header = data[0];
     setDataHeader(header); // useState variable
     setLoading(false); // useState variable
   });
 })();
}

{ loading ? <SkeletonHeader /> : <CampaignHeader data={dataHeader} /> }
javascript reactjs fetch-api react-suspense

评论

1赞 OlegWock 11/17/2023
请显示最小的可重现示例,或者至少显示函数的实现和完整的组件代码fetchCampaignHeaderData

答:

0赞 natashap 11/17/2023 #1

这始终是一个很好的做法,React 推荐的方法,使所有 API 调用都包含在 useEffect 钩子中。

请尝试以下操作:

const LazyHeader = () => {
    const [data, setData] = useState();

    useEffect(async () => {
        const data = await fetchCampaignHeaderData({ client });
        setData(data[0]);
    }, []); 

    return <CampaignHeader data={data} />;
};

评论

0赞 jNiuk 11/17/2023
这是行不通的。现在,我收到一个递归错误,指出我的数据未定义。
0赞 natashap 11/17/2023
请使用数据类型 data[0](空对象或数组或字符串)初始化 useState
0赞 jNiuk 11/17/2023
同样的事情。我收到 1000 个错误
0赞 natashap 11/17/2023
您是否使用惰性方法导入组件?如果可能,请分享错误截图