ReactNative FlatList 一次渲染所有项目?

Posted

技术标签:

【中文标题】ReactNative FlatList 一次渲染所有项目?【英文标题】:ReactNative FlatList render all items at once? 【发布时间】:2018-01-18 12:23:18 【问题描述】:

我正在使用 ReactNative 的新 List 组件 - FlatList。

即使单元格实际上在屏幕上不可见,FlatList 似乎也会一次呈现所有项目。

<FlatList data=this.props.items 
          keyExtractor=(item, index) => generateKey()
         renderItem=this.renderStrip/>

 renderItem = (item) =>  
   console.warn('rendered!');
   return <View style=height:200, height: 100 />

设置 30 个项目,似乎根据项目的总数调用了“渲染”警告。

我认为 FlatList 类似于 android 中的 RecycleView 的工作方式,仅当项目即将在屏幕上可见时才呈现它。

我错过了什么吗?不会降低性能吗? 我希望它只能在项目即将显示时才呈现它。

【问题讨论】:

我也遇到过同样的问题。所有行都立即呈现,无需向下滚动 我在物理设备上看到了这个问题,但在模拟器上没有。它在向屏幕显示任何内容之前渲染所有行。 @itinance Josh 你是否以某种方式解决了这个问题? 【参考方案1】:

在我的一个应用程序中遇到了同样的问题。为我解决这个问题花了我几个小时。

⇓⇓⇓

TDLR; 请注意,您没有将 FlatList 嵌套在 ScrollList(或其他类型的列表)中。

⇑⇑⇑

详细说明:

问题

与 Thread-Opener 相同,起初,我的 Flatlist 仅渲染我在 initialNumToRender 中定义的渲染数量,但紧接着,应用程序开始渲染整个列表的其余部分。

环境

我使用 native-base.io 作为 UI-Library 并用组件封装了屏幕的内容

解决方案

我发现,原生组件&lt;Content&gt; 替换了ScrollList。 ScrollList 中的 FlatList 会将您传送到奇怪的结果。 当我将给定屏幕的 -Component 替换为 &lt;View&gt; 时,所有事情都按预期工作。

【讨论】:

嘿,@suther 我也遇到过同样的问题 :),但我不能很好地理解您的解决方案?你的意思是替换&lt;Content&gt; with &lt;View&gt; 参见“TDLR”。考虑到这一点,您会发现,NativeBase.io&lt;Content&gt;-Component 提供了自己的 ScrollLists see the SourceCode here,。为确保您不会将 FlatList 嵌套到 ScrollList 中,可能会解决您的问题。祝你好运。【参考方案2】:

FlatList 提前渲染了太多项目以获得更好的填充率。我们有类似的问题。我们构建 RecyclerListView 来解决此类问题。与 RecyclerView 非常相似,但它只是 JS。它比 FlatList 更快,并在 Flipkart 进行了实战测试。你可以试试看。

链接:https://github.com/Flipkart/ReactEssentials

您可以在此处阅读更多信息:https://medium.com/@naqvitalha/recyclerlistview-high-performance-listview-for-react-native-and-web-e368d6f0d7ef

【讨论】:

我查过了,很好,如果有一个用钩子代替夹子的例子就更好了【参考方案3】:

是一样的。在文档中,您可以找到以下内容:

为了限制内存并实现平滑滚动,内容在屏幕外异步呈现。这意味着滚动速度可能快于填充率,并且会暂时看到空白内容。这是一种权衡,可以根据每个应用程序的需求进行调整,我们正在努力在幕后对其进行改进。

所以它不会一次渲染所有项目。

此外:

这是一个 PureComponent,这意味着如果 props 保持浅相等,它将不会重新渲染。确保您的 renderItem 函数所依赖的所有内容都作为更新后不 === 的 prop(例如 extraData)传递,否则您的 UI 可能不会在更改时更新。这包括 data prop 和父组件状态。

如果您需要更多详细信息,请告诉我。

【讨论】:

我有一个包含 10 个项目的 FlatList。其中只有 2 个同时可见。每个 renderChild 返回的组件都会渲染一个 Image。然而,对这些图像的所有请求都是在呈现 FlatList 时发出的(尽管只有 2 个项目可见) 我有一个包含 1000 个启用疼痛的项目的平面列表。它仍然渲染 100 多个项目。这令人毛骨悚然。并且因为我使用 redux,每次我滑动一个页面,所有 100 个项目并再次增加渲染。 @DanielJosePadillaPeña 我也面临同样的问题,您找到解决方案了吗? FlatList 在里面渲染 ScrollView,我似乎找不到解决方案。检查堆栈溢出或检查 github 问题似乎无法解决这个问题。 @DanielJosePadillaPeña 你找到解决方案了吗?

以上是关于ReactNative FlatList 一次渲染所有项目?的主要内容,如果未能解决你的问题,请参考以下文章

React Native - FlatList 不渲染

当 SectionList/Flatlist 滚动/渲染项目时 UI 线程似乎被阻塞(React Native)

如何反应原生重新渲染 Flatlist?

从 Firebase 渲染 FlatList 中的数据

React Native - FlatList - 内部状态

React Native FlatList 原理解析与性能优化