reactjs - 虚拟化列表 : You have a large list that is slow to update

标签 reactjs react-native react-native-flatlist

我使用 FlatList 来处理大量项目。我从 Expo XDE 收到以下警报。

VirtualizedList: You have a large list that is slow to update - make sure your renderItem function renders components that follow React performance best practices like PureComponent, shouldComponentUpdate, etc. {"dt":13861,"prevDt":1498372326027,"contentLength":6624}

我对 FlatList 使用了一些优化方法,例如 PureComponent,但我仍然收到此警报。在我描述我的优化之前,您能否告诉我,即使 FlatList 已优化,此警报是否始终出现?或者它可能表明了性能的实际问题?我这么问是因为我的 FlatList 性能很好。

最佳答案

我之前看到过这个错误。优化我的代码后,我不再看到它。我通过将 console.log() 语句添加到创建 FlatList 的组件的 render() 函数以及呈现列表中每个项目的函数来解决这个问题。我注意到,每当该页面上的任何组件(甚至与 FlatList 不相关的组件)发生状态更改时,我的代码都会重新渲染整个 FlatList 及其所有项目。我通过将各种组件转换为 PureComponents 解决了这个问题。我的 FlatList 声明如下所示:

<FlatList
    ref={(ref) => { this.flatListRef = ref; }}
    data={allPosts}
    initialNumToRender={7}
    renderItem={({ item }) =>
      <Post postJson={item} isGroupAdmin={isGroupAdmin} user={user} />
    }
  />

请注意,我要返回 <Post />这是一个纯组件:

import React, { PureComponent } from 'react';
class Post extends PureComponent {

  render() { ... }
}

这可确保仅当帖子更改时 FlatList 才会重新渲染。当我之前将一个普通函数传递给 renderItem 时即,执行如下操作的函数:

return (
  <View>
  ...
  </View>
);

我注意到,每当任何项目发生更改时,FlatList 就会重新渲染所有项目。现在,通过使用 PureComponent,FlatList 仅呈现添加到列表中的新项目(如果列表已显示)。

第一次渲染整个列表仍然需要相对较长的时间。然而,initialNumToRender确保屏幕几乎立即被填满(而剩余的项目在后台渲染)。更重要的是,在初始渲染之后,FlatList 一次只需渲染一项(发生更改的项)。

我找到了this post很有帮助)。

我刚刚意识到这也得到了解释here

关于reactjs - 虚拟化列表 : You have a large list that is slow to update,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44743904/

相关文章:

javascript - React+Redux - Uncaught Error : Expected the reducer to be a function

javascript - 从多个类导出的 js 中 react 加载导入

javascript - 如何将现有的非 React-Native-Component JS 导入/需要到 React Native 组件

android - React Native 应用程序 - 在 Android 8 真实设备上启动时崩溃/关闭

react-native - React Native Flatlist numColumns 没有制作多列

javascript - react 是否有可能从另一个 child 身上激发一个 child 身上实现的功能?

javascript - 始终在平面列表中显示滚动条

javascript - 如何在 Javascript 中使用新日期执行条件?

react-native - 仅在 Flatlist 中加载可见图像 react 原生

ios - 如何在某些数据部分之后将分隔符添加到 FlatList 中?