javascript React暂停防止回退微调器 Flink

bnlyeluc  于 2023-06-04  发布在  Java
关注(0)|答案(3)|浏览(173)

我想知道是否有一个好的方法来防止 Flink 的回落React。我正在使用React路由器,问题是当一个组件被挂起时,回退加载器会快速 Flink ,这非常烦人。我在这里看到了React suspense/lazy delay?的答案,它看起来像下面这样:

const Home = lazy(() => {
  return Promise.all([
    import('./components/Home'),
    new Promise(resolve => setTimeout(resolve, 500))
  ]).then(([moduleExports]) => moduleExports);
});

但我的问题是,我有一个透明背景的覆盖加载微调器,组件实际上直到promise被解决才加载。这会让页面挂起半秒钟没有内容,实际上比旋转器的 Flink 更烦人。
所以我想问题是有没有人找到一个好方法来处理这个问题。我真的很想在页面上添加一些类似nprogress的东西,但不知道如何用React.suspense实现它。我可能不得不回到使用react可加载,但我真的不想当react自带基本相同的功能时。

nuypyhwy

nuypyhwy1#

我最近也面临着同样的问题,我最终实现了一个组件,我用它来处理悬念的fallback
这个想法很简单,只要在一定的时间内不显示任何内容,然后显示加载程序。因此,假设在300ms内不会显示任何内容,延迟后它应该显示(在本例中)ContentLoader或任何您喜欢的内容。
在Typescript中为lazy-loader.ts

import { FC, useEffect, useState } from 'react';
import ContentLoader from './content-loader'; // or any spinner component

export interface LazyLoaderProps {
  delay?: number;
}

const LazyLoader: FC<LazyLoaderProps> = ({
  delay = 250,
  ...props
}) => {
  const [show, setShow] = useState(false);

  useEffect(() => {
    const timeout = setTimeout(() => {
      setShow(true);
    }, delay);
    return () => {
      clearTimeout(timeout);
    };
  }, [delay]);

  return show ? <ContentLoader {...props} /> : null;
};

export { LazyLoader as default };

然后像这样使用

import LazyLoader from "./lazy-loader"
// ...
<Suspense fallback={<LazyLoader delay={300} />}>...</Suspense>

这并不影响进口。(我也认为这不是最佳的)让我知道这是否有帮助。

aiqt4smr

aiqt4smr2#

几周前我就在这个场景中,我希望Suspense回退不呈现,我们都知道如果惰性组件处于下载状态,回退将显示
这是Suspense的正常行为,与此无关,相反,我们可以通过复制网页的部分背景设计来欺骗最终用户的观点

/* style.css */
.main-pane {
   width: '100%',
   height: '100%',
   backgroundColor: #deb887
}
.header-pane {
   width: '100%',
   height: '100%',
   position: 'absolute',
   top: 0,
   backgroundColor: #424242
}
//EmptyPage.js
import styles from './style.css';
const EmptyPage = () => {
   return (
      <div style={styles['main-pane']}>
         <div style={styles['header-pane']}><div/>
      </div>
   )
}
//MainPage.js
import styles from './style.css';
const MainPage = () => {
   return (
      <div style={styles['main-pane']}>
         <div style={styles['header-pane']}>HEADER CONTENT<div/>
         BODY CONTENT
      </div>
   )
}
//App.js
const MainPage = lazy(() => import('./pages/MainPage'))

import EmptyPage from './pages/EmptyPage';
import styles from './style.css';
const App = () => {
   return (
      <Suspense fallback={<EmptyPage/>}>
         <Router>
            ...
            <MainPage/>
         </Router>
      </Suspense>
   )
}

因此,我们的目标只是复制部分背景设计,而不是 Flink 或一些不是友好的经验,以我们的最终用户的Angular

rhfm7lfc

rhfm7lfc3#

import React, { Suspense, lazy } from "react";

const Home = lazy(() => {
  return Promise.all([
    import("./home"),
    new Promise(resolve => setTimeout(resolve, 300))
  ]).then(([moduleExports]) => moduleExports);
});

function FullSpinner() {
  return (
    {/**  full spinner jsx goes here */}
    <div className="full-spinner">
      <p>loading....</p>
    </div>
  )
}

function App() {
  return (
    <div className="App">
      <h1>app component</h1>
      <Suspense fallback={<FullSpinner />}>
        <Home />
      </Suspense>
    </div>
  );
}

编辑:

import React, { Suspense, lazy, useState, useEffect } from "react";

const Home = lazy(() => {
  return Promise.all([
    import("./home"),
    new Promise(resolve => setTimeout(resolve, 500))
  ]).then(([moduleExports]) => moduleExports);
});

function FullSpinner() {
  return (
    <div className="full-spinner">
      <p>loading....</p>
    </div>
  );
}

const LazyLoading = ({ delay, loader: Loader, children }) => {
  const [ready, setReady] = useState(false);
  useEffect(() => {
    setTimeout(() => setReady(true), delay);
  }, [delay]);
  return ready ? (
    <Suspense fallback={<Loader />}>{children}</Suspense>
  ) : (
    <Loader />
  );
};

function App() {
  return (
    <div className="App">
      <h1>app component</h1>
      <LazyLoading delay={2000} loader={FullSpinner}>
        <Home />
      </LazyLoading>
    </div>
  );
}

相关问题