小编典典

反应本机FlatList与ListView

reactjs

“改用新的FlatList或SectionList组件。除了简化API之外,新的列表组件还具有显着的性能增强,主要的优点是几乎可以恒定使用任意数量的行。”

这在React
Native的官方文档中有所说明。但是,无论我多么努力,在向下滚动时,FlatList内存的使用只会使天空飞速上升。与使用更少内存的ListView组件相比。


阅读 299

收藏
2020-07-22

共1个答案

小编典典

TLDR

创建要在renderItem中使用的PureComponent:class ListItem extends React.PureComponent

然后,您需要确保实施shouldComponentUpdate

当我有一个FlatList内部时,我似乎也有性能问题ScrollView

所以我整天都在搞砸,试图弄清为什么FlatList消耗了我的RAM使用量,并且用几千个列表将电池吸干了。我所看到的被renderItem多次称为每个项目。如果我有100件商品,renderItem则将对商品1-10调用一次,然后对商品1-10调用一次,对商品10-20调用一次,然后对商品1-20调用一次,对商品20-30调用一次,依此类推。这让我感到困惑,为什么会这样。但是我意识到,没有任何优化,就意味着它正在重建该列表中的每个项目并呈指数增长。要解决此问题,您需要执行以下操作:

像他们在文档中建议的那样创建PureComponent以进行优化: class ListItem extends React.PureComponent

然后,您需要确保实施 shouldComponentUpdate

完成这两项操作后,我的JS
FPS和RAM使用率将保持在水平,直到我滚动到分别有一点下降和峰值的位置,但重要的是它们又回到了一个不错的水平。这与之前我从JS中看到1
FPS以及超过RAM使用量的情况进行了比较。

似乎FlatList可以渲染尽可能多的项目,并且它与可见项目之间的距离越远,则赋予项目渲染的优先级就越低。它将虚拟存储在屏幕上的项目保留下来,以便用户滚动时可以将它们立即推到屏幕上。如果不优化组件渲染方法,这可能导致大量列表占用大量内存。

2020-07-22