reactjs 在初始页面加载之后,是否可以将当前组件作为React.Suspense的“回退”内容进行挂载?

cbeh67ev  于 2023-02-08  发布在  React
关注(0)|答案(3)|浏览(270)

我使用动态import()语法将每个路由组件拆分为一个单独的bundle和React.lazy,以便仅在需要时加载组件。我有一个PageLoading组件,用作<React.Suspense />的回退内容。
是否可以保持当前视图组件的挂载状态,直到"延迟加载"组件准备好呈现为止?这些捆绑包各自都很小,所以在呈现"回退"时,页面最终不可避免地只 Flink 了不到半秒钟。
谢谢你。
编辑:我并不是想制造一个人为的延迟,我所要求的正是我所描述的。

agxfikkp

agxfikkp1#

我编写了一个组件,它接受您要呈现的惰性组件,并将<Suspense />的fallback属性设置为先前呈现的组件:

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} />
ecbunoof

ecbunoof2#

你是指this之类的东西吗?
我也在寻找正确的方法,尝试了很多方法,目前我最好的方法是在呈现页面时更新回退,无论页面是否是延迟加载的,所以回退必须是一种状态,而不是类似

<div>Loading...</div>

它必须与当前呈现的页面是同一个组件示例。Here是它的源代码。

gojuced7

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>

相关问题