我使用动态import()语法将每个路由组件拆分为一个单独的bundle和React.lazy,以便仅在需要时加载组件。我有一个PageLoading组件,用作<React.Suspense />的回退内容。是否可以保持当前视图组件的挂载状态,直到"延迟加载"组件准备好呈现为止?这些捆绑包各自都很小,所以在呈现"回退"时,页面最终不可避免地只 Flink 了不到半秒钟。谢谢你。编辑:我并不是想制造一个人为的延迟,我所要求的正是我所描述的。
import()
React.lazy
PageLoading
<React.Suspense />
agxfikkp1#
我编写了一个组件,它接受您要呈现的惰性组件,并将<Suspense />的fallback属性设置为先前呈现的组件:
<Suspense />
import * as React from 'react'; export type LazyProps = { component: React.LazyExoticComponent<() => JSX.Element>; initialFallback?: JSX.Element; }; export const Lazy = ({ component, initialFallback = <></> }: LazyProps): JSX.Element => { const fallback = React.useRef(() => initialFallback); const Component = component; const updateFallback = async (): Promise<void> => { const result = await component._result; fallback.current = typeof result === 'function' ? result : (result as any).default; }; React.useEffect(() => { updateFallback(); }, [component]); return ( <React.Suspense fallback={<fallback.current />}> <Component /> </React.Suspense> ); };
其可用作:
<Lazy component={MyLazyComponent} />
ecbunoof2#
你是指this之类的东西吗?我也在寻找正确的方法,尝试了很多方法,目前我最好的方法是在呈现页面时更新回退,无论页面是否是延迟加载的,所以回退必须是一种状态,而不是类似
<div>Loading...</div>
它必须与当前呈现的页面是同一个组件示例。Here是它的源代码。
gojuced73#
我相信我发布的here的答案也适用于这里。没有看到代码示例,我不知道你的确切情况-但你可以通过简单地将整个路由器Switch Package 在Suspense中来实现你所描述的行为。例如:
<Suspense fallback={<PageLoading />}> <Switch> <Route exact path="/" component={Page1} /> <Route path="/page-2" component={Page2} /> <Route path="/page-3" component={Page3} /> </Switch> </Suspense>
3条答案
按热度按时间agxfikkp1#
我编写了一个组件,它接受您要呈现的惰性组件,并将
<Suspense />
的fallback属性设置为先前呈现的组件:其可用作:
ecbunoof2#
你是指this之类的东西吗?
我也在寻找正确的方法,尝试了很多方法,目前我最好的方法是在呈现页面时更新回退,无论页面是否是延迟加载的,所以回退必须是一种状态,而不是类似
它必须与当前呈现的页面是同一个组件示例。Here是它的源代码。
gojuced73#
我相信我发布的here的答案也适用于这里。没有看到代码示例,我不知道你的确切情况-但你可以通过简单地将整个路由器Switch Package 在Suspense中来实现你所描述的行为。
例如: