Suspense 主要用来解决网络 IO 问题,它早在 2018 年的 React 16.6.0 版本中就已发布。它的相关用法有些已经比较成熟,有的相对不太稳定,甚至经历了重命名、删除:
如果你还没有明白这是什么意思那我简单的表述成下面这句话:
调用 render 函数->发现有异步请求->悬停,等待异步请求结果->再渲染展示数据
看着是非常神奇的,用同步方法写异步,而且没有 yield/async/await ,简直能把人看傻眼了。这么做的好处自然就是,我们的思维逻辑非常的简单,清楚,没有 callback ,没有其他任何玩意,不能不说,看似优雅了非常多而且牛逼。
在前端开发中,经常会有这样的需求,加载某个界面时,如果界面的资源比较大,前端对数据的处理也需要时间,加载比较慢,这时候我们需要用一个加载动画或者提示,使得交互更加友好。
一. 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>
);
}
因为没有后端逻辑,前端表格组件主要用于在前端对 Excel 、Grid 表格数据在线编辑和展示,而利用 Suspense 的技术特点,便可以轻松实现前后端 IO 异步操作:
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>
)
看一下效果:
了解更多在线 demo: https://demo.grapecity.com.cn/spreadjs/gc-sjs-samples/index.html
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.