React native 平面列表与滚动视图

React native 平面列表与滚动视图,react-native,React Native,在react native中,FlatList和ScrollView的结构有什么不同 对于应用程序中的滚动视图,它们似乎是相等的,但ScrollView非常简单,而不是FlatList,因此当我们必须在代码中使用FlatList时?这与FlatList和ScrollView有很大区别 ScrollView将在加载组件后立即加载项(其中的数据用于滚动)。因此,所有数据都将装入RAM,您不能在其中使用成百上千项(因为性能低下) 但FlatList对于这个问题有一个更好的解决方案,它将在屏幕上挂载10

在react native中,FlatList和ScrollView的结构有什么不同


对于应用程序中的滚动视图,它们似乎是相等的,但ScrollView非常简单,而不是FlatList,因此当我们必须在代码中使用FlatList时?

这与FlatListScrollView有很大区别

ScrollView将在加载组件后立即加载项(其中的数据用于滚动)。因此,所有数据都将装入RAM,您不能在其中使用成百上千项(因为性能低下)

但FlatList对于这个问题有一个更好的解决方案,它将在屏幕上挂载10个项目(默认情况下),如果用户滚动视图,其他项目将挂载。 这是FlatList而不是ScrollView的一大优势


您可以在小项目(如100个项目)中使用ScrollView,甚至在10000个项目中使用FlatList。

它们有不同的用法

FlatList
用于呈现大量项目。如果选中,则需要传递一个
数据数组
,然后使用
renderItem
回调呈现数组中的每个项目。它经过优化,在非常大的数组中具有非常好的性能,因为它实际上只渲染当前需要显示的项目

ScrollView
用于呈现通用内容,当内容大于
ScrollView
本身时,它会滚动。您不需要传递数据数组,但可以使用与普通
视图相同的方式将元素放入ScrollView中。但是,要小心,它不会为很长的内容提供相同的平面列表优化

根据经验:

是否需要从数组中呈现类似项的列表?使用
FlatList


是否需要在可滚动的容器中呈现通用内容?使用
ScrollView

这里似乎没有人指出的一个真正大的区别是,组件状态不是用FlatList组件维护的,而是用ScrollView维护的。这是因为ScrollView一次呈现所有子对象并维护它们。同时,FlatList会在组件离开屏幕时卸载组件,并在项目从屏幕返回时从头开始重新创建组件(因此状态丢失)。

很好的解释。我想问一件事,如果。我有一个通用页面,比如说一个城市的详细信息、描述、照片以及同一屏幕上的地点和酒吧列表。一个位置列表最多可以有100个项目。现在我在ScrollView中嵌套了FlatList,这给了我一个警告。这里最好的解决方案是什么?您得到了哪条警告?虚拟化列表永远不应该嵌套在纯滚动视图中。这可能很有用:您能否给出一个与此相关的使用场景?如果您使用平面列表列出管理其自身状态的可交互组件,则使用平面列表可能会遇到问题。假设您列出了一组Todo,其中每个Todo负责管理自己的状态状态(“挂起”vs“完成”),其中每个Todo以初始状态“挂起”开始。如果您将Todo标记为“完成”,将其从页面上滚下,然后再将其滚回,它将重新构建该项目,其初始状态为“挂起”“。如果要使用平面列表,状态将不会被保存,重要的是将列表项的状态外部化到平面列表之外。此评论非常有见解,没有人指出它!Thanks@alaboudi-所以如果我们有一个很长的待办事项列表,那么很明显,平面列表不是一个选项..就像你说的。。但是ScrollView一次呈现所有内容,这可能会导致内存问题……那么解决方案是什么呢?我想到了一个——分页……任何其他??通常有两种“类型”的React组件:有状态和无状态。有状态组件使用内部变量帮助组件实现其目标。卸载组件时,这些变量将被清除。如果将平面列表与有状态组件一起使用,则在卸载组件并将其重新构建到页面上时,该组件将重置其状态。相反,您可以做的是从外部源以
prop
的形式传递状态,使组件成为无状态。人们可以手动管理组件外部的状态,也可以求助于库(如Redux)来实现。