在React.js中加载异步数据时防止UI闪烁

Preventing UI flicker when loading async data in React.js

本文关键字:UI 闪烁 数据 异步 React js 加载      更新时间:2023-09-26

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