找回密码
 立即注册

QQ登录

只需一步,快速开始

爱迪生

超级版主

55

主题

65

帖子

1402

积分

超级版主

Rank: 8Rank: 8

积分
1402
爱迪生
超级版主   /  发表于:2022-5-30 12:01  /   查看:2049  /  回复:0
本帖最后由 爱迪生 于 2022-5-30 14:36 编辑

需求:
在前端开发中,经常会有这样的需求,加载某个界面时,如果界面的资源比较大,前端对数据的处理也需要时间,加载比较慢,这时候我们需要用一个加载动画或者提示,使得交互更加友好
一.React18之前的做法:
在React18之前,我们要实现上面这个效果,请求数据或者加载新的组件的时机一般在componentDidMount,在State中需要一个flag变量来记录请求数据的状态,后续手动更改这个状态,非常的不方便大致代码如下:
  1. class App extends Component {
  2.   state = {
  3. isLoading: false,
  4.   }

  5.   componentDidMount() {
  6.     this.setState({
  7.       data: null,
  8. isLoading: true,
  9.     });
  10.     axios.get('/api/getData').then((data) => {
  11.       this.setState({
  12.         data,
  13. isLoading: false,
  14.       });
  15.     });
  16.   }

  17.   render() {
  18.     return this.state.loading ? '正在加载中...' : (
  19.       <Page data={data} />
  20.     );
  21.   }
  22. }

复制代码


二.React18之后:
1.React.lazy
React.lazy() 允许你定义一个动态加载的组件。这有助于缩减 bundle 的体积,并延迟加载在初次渲染时未用到的组件
  1. const SomeComponent = React.lazy(() => import('./SomeComponent'));
复制代码
渲染 lazy 组件依赖该组件渲染树上层的 <React.Suspense> 组件。这是指定加载指示器(loading indicator)的方式。
2.React.Suspense
React.Suspense 可以指定加载指示器(loading indicator),以防其组件树中的某些子组件尚未具备渲染条件
  1. // 该组件是动态加载的
  2. const OtherComponent = React.lazy(() => import('./OtherComponent'));

  3. function MyComponent() {
  4.   return (
  5.     // 显示 <Spinner> 组件直至 OtherComponent 加载完成
  6.     <React.Suspense fallback={<Spinner />}>
  7.       <div>
  8.         <OtherComponent />
  9.       </div>
  10.     </React.Suspense>
  11.   );
  12. }
复制代码
3.用Suspense加载SpreadJS组件:
  1. const PureSpread = React.lazy(() => import('./components/pureSpread'))
  2. const SpreadDesigner = React.lazy(() => import('./components/designer'))
  3. const {Content,Header} = Layout



  4. const App = () => (
  5.   <Layout className="app">
  6.      <IndexSider/>
  7.      <Layout>
  8.         <Content className="index-content">
  9.           <HashRouter>
  10.               <Switch>
  11.                 <Suspense fallback={<div>loading...</div>}>
  12.                   <Route exact path="/" component={PureSpread}/>
  13.                   <Route exact path="/designer" component={SpreadDesigner}/>   
  14.                 </Suspense>
  15.               </Switch>
  16.           </HashRouter>
  17.         </Content>
  18.         <IndexFooter/>
  19.      </Layout>
  20.   </Layout>
  21. )
复制代码

看一下效果:
image.png68340147.png





saleList1.zip

669.09 KB, 下载次数: 618

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部