我正在使用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的工作方式,只有当它在屏幕上可见时才会呈现项目。
我错过了什么吗?它不会降低性能吗? 我希望它只能在它即将展示时呈现一个项目。
答案 0 :(得分:3)
我的一个应用中出现了相同的问题。为我解决这个问题花了几个小时。
⇓⇓⇓
TDLR; 检查一下,确认您没有将FlatList嵌套在ScrollList(或其他类型的列表)中。
⇑⇑⇑
详细说明:
问题
就像Thread-Opener一样,我的Flatlist首先对我在initialNumToRender
中定义的渲染计数,但是立即开始渲染列表的其余部分。
环境
我将 native-base.io 用作UI库,并使用Component封装了屏幕内容
解决方案
我发现,本机基础组件<Content>
替换了ScrollList。 ScrollList内的FlatList会将您引导到奇怪的结果。
当我用<View>
替换给定Screen的-Component时,所有工作都按预期进行。
答案 1 :(得分:0)
它是一样的。在文档中,您可以找到以下内容:
为了限制内存并启用平滑滚动,内容将在屏幕外异步呈现。这意味着可以比填充率更快地滚动,并暂时看到空白内容。这是一个可以调整以适应每个应用程序需求的权衡,我们正在努力在幕后进行改进。
因此它不会立即渲染所有项目。
此外:
这是一个PureComponent,这意味着如果道具保持浅层相等,它将不会重新渲染。确保renderItem函数所依赖的所有内容在更新后作为prop(例如extraData)传递,而不是===,否则您的UI可能无法更新更新。这包括数据支柱和父组件状态。
如果您需要更多详细信息,请与我们联系。
答案 2 :(得分:0)
FlatList提前渲染太多项目以获得更好的填充率。我们有类似的问题。我们构建RecyclerListView以解决此类问题。与RecyclerView非常相似,但它只是JS。它比FlatList更快,并且在Flipkart进行了战斗测试。你可以尝试一下。