在React.js中加载异步数据时防止UI闪烁
Preventing UI flicker when loading async data in React.js
IndexedDB中有一些数据,只能异步访问。我想用这些数据构建一个React.js用户界面。总体想法是,我将拥有多个React组件,这些组件从IndexedDB加载数据,并显示基于该数据的一些UI,用户将能够在当前显示的组件之间切换。
我担心的是,如果没有多余的UI闪烁,我不知道如何优雅地完成这项工作。我可以在componentDidMount
中进行异步数据加载,并将数据放在this.state
中,但在render
完成之前,它将被调用,这迫使我在检索IndexedDB中的数据时,要么不显示任何内容,要么只显示一小部分占位符数据。
我宁愿在从IndexedDB加载数据之前不使用render
。我知道加载不会花很长时间,而且我宁愿在加载新数据时继续显示以前的组件,所以只有一个闪烁(旧->新),而不是两个闪烁(老->空白/占位符->新)。这更像是普通网页的工作方式。当您单击从一个网站到另一个网站的链接时,浏览器在等待链接网站的服务器响应时不会立即显示空白/占位符屏幕。
我想我可以在调用React.render
然后通过this.props
传入之前,在React组件之外进行数据加载。但这似乎很混乱,因为嵌套组件会变得棘手,而且我的一些组件会随着时间的推移进行更新,并通过初始化它们的完全相同的代码从IndexedDB中提取新数据。因此,它似乎是在this.state
中存储数据的理想用例,因为当我得到新数据可用的信号时,我可以在组件本身中更新它。初始化和更新就像调用在this.state
中设置一些值的this.loadData()
函数一样简单。。。但是我有前面提到的额外的闪烁。
有人有更好的主意吗?这个问题的规范解决方案是什么?真的只是让毫秒的空白/占位符到处闪烁吗?
从注释中听起来,您在上一个实现中的行为(等待导航,直到获取必要的数据)是所需的目标。如果是这样的话,在不出现闪烁的情况下,最好的方法是使用一些外部对象来管理状态,并在提取数据时将其作为道具传递。
React Router有一个非常好的解决方案,它有willTransitionTo挂钩,可以在导航之前获取给定组件的数据。这还有一个额外的好处,即如果出现问题,可以很容易地发现错误。
更新了新链接:
https://github.com/reactjs/react-router
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- jQuery UI自动完成突然停止工作
- 如何使用skip参数使用angular ui引导进行服务器端分页
- AngularJS UI路由器不能像ng路由器那样工作
- 我可以更改剑道UI网格吗's的外键值
- 为什么在单独的函数中应用时转换会闪烁/断断续续(D3)
- 剑道UI内联编辑:如何在点击其他按钮时隐藏按钮
- Rails/JSON:如何将JSON用于jquery UI自动完成表单
- 停止jQuery UI滑块移动超过给定值
- 使用jQuery以红色和黑色闪烁文本
- 混合 ui-sref 和 $state.go 在 Angular ui-router 中进行状态转换
- Jquery UI自动完成无法工作
- 我的Tizen应用程序在点击时会闪烁
- UI引导区渐变旋转木马闪烁白色
- 如何停止闪烁效果并将其替换为 jQuery UI 中的突出显示效果
- 剑道UI窗口闪烁旧内容
- Angular ui路由器禁用自动滚动以修复闪烁
- Angular Ui引导折叠页面加载时闪烁
- 在React.js中加载异步数据时防止UI闪烁
- Angular ui-router嵌套视图会闪烁undefined