找回密码
 立即注册

QQ登录

只需一步,快速开始

葡萄城花卷
超级版主   /  发表于:2022-7-1 14:21  /   查看:2737  /  回复:0
Suspense简介
Suspense主要用来解决网络IO问题,它发布于2018年的React 16.6.0版本中。关于Suspense的相关用法有些已经比较成熟,有的相对不太稳定,甚至经历了重命名、删除。
Suspense的主要用法特征如下:

  • 在render函数中,我们可以写入一个异步请求,请求数据
  • react会从我们缓存中读取这个缓存
  • 如果有缓存了,直接进行正常的render
  • 如果没有缓存,那么会抛出一个异常,这个异常是一个promise
  • 当这个promise完成后(请求数据完成),react会继续回到原来的render中(实际上是重新执行一遍render),把数据render出来
  • 完全同步写法,没有任何异步callback之类的东西
如果你还没有明白这是什么意思,我们可以简单将这个过程概括为:
调用render函数->发现有异步请求->悬停,等待异步请求结果->再渲染展示数据
这种方法看着非常神奇,用“同步”方法写“异步”,而且没有使用yield/async/await。这么做的优势是能让我们的思维逻辑非常清晰,没有callback,没有其他干扰内容,简洁优雅地完成操作。
Suspense 的主要用法和场景

在前端开发中,经常会有这样的需求,加载某个界面时,如果界面的资源比较大,前端对数据的处理也需要时间,加载比较慢,这时候我们需要用一个加载动画或者提示,使得交互更加友好。

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 的体积,并延迟加载在初次渲染时未用到的组件,载入方式如下:
constSomeComponent = 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. }
复制代码
配合前端表格组件处理前后端IO异步操作
因为没有后端逻辑,前端表格组件主要用于在前端对 Excel、Grid 表格数据在线编辑和展示。利用Suspense的技术特点,便可以轻松实现前后端IO异步操作:
  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.png335689696.png

总结
到这里我们已经实现使用React Suspense处理前后端IO异步操作,如果大家还有其他想法欢迎在评论和我们一起讨论~
公众号回复“react尝鲜”获取文内demo



0 个回复

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