爱迪生 发表于 2022-5-30 12:01:35

React Suspense 尝鲜,处理前后端IO异步操作

本帖最后由 爱迪生 于 2022-5-30 14:36 编辑

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

componentDidMount() {
    this.setState({
      data: null,
isLoading: true,
    });
    axios.get('/api/getData').then((data) => {
      this.setState({
      data,
isLoading: false,
      });
    });
}

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



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

function MyComponent() {
return (
    // 显示 <Spinner> 组件直至 OtherComponent 加载完成
    <React.Suspense fallback={<Spinner />}>
      <div>
      <OtherComponent />
      </div>
    </React.Suspense>
);
}3.用Suspense加载SpreadJS组件:const PureSpread = React.lazy(() => import('./components/pureSpread'))
const SpreadDesigner = React.lazy(() => import('./components/designer'))
const {Content,Header} = Layout



const App = () => (
<Layout className="app">
   <IndexSider/>
   <Layout>
      <Content className="index-content">
          <HashRouter>
            <Switch>
                <Suspense fallback={<div>loading...</div>}>
                  <Route exact path="/" component={PureSpread}/>
                  <Route exact path="/designer" component={SpreadDesigner}/>   
                </Suspense>
            </Switch>
          </HashRouter>
      </Content>
      <IndexFooter/>
   </Layout>
</Layout>
)
看一下效果:






页: [1]
查看完整版本: React Suspense 尝鲜,处理前后端IO异步操作