通常情况下,当我返回一个依赖于获取的数据的组件时(我正在使用nextjs 13),我会有条件地渲染元素以确保值可用:
TableComponent:
如果我尝试使用Suspense从父组件加载TableComponent,它会加载但在加载完成之前不显示fallback。
TableComponent:
export const Table = ({ ...props }) => {
const [tableEvents, setTableEvents] = useState(null);
useEffect(() => {
fetchAndSetTableEvents();
}, []);
async function fetchAndSetTableEvents() {
const fetchedEvents = await fetch(* url and params here *)
if (fetchedEvents && fetchedEvents) {
setTableEvents(fetchedEvents);
} else {
setTableEvents(null);
}
}
return (
<React.Fragment>
<div>
{tableEvents ? tableEvents[0].title : null}
</div>
</React.Fragment>
)
};
如果我尝试使用Suspense从父组件加载TableComponent,它会加载但在加载完成之前不显示fallback。
<Suspense fallback={<div>Loading Message...</div>}>
<TableComponent />
</Suspense>
然而,如果我在TableComponent中删除条件渲染并只指定变量,则在尝试加载组件时正确显示回退:
return (
<React.Fragment>
<div>
{tableEvents[0].title}
</div>
</React.Fragment>
)
但它最终无法加载组件,因为tableEvents最初为null,并且每次获取都会有所变化,因此无法拥有可预测的键。
React文档中关于暂停的示例非常简单。
条件返回渲染也会成功返回组件,但无法显示悬挂回退。
if (tableEvents) {
return (
<React.Fragment>
<div>
{tableEvents[0].event_title}
</div>
</React.Fragment>
)
}
问题
如何在组件中获取并返回值,这些值可能存在也可能不存在,并且满足Suspense回退的条件以在加载时显示。我假设它依赖于Promise,但我却无法找到解决方法。