React Native 列表组件:FlashList、FlatList 及更多

news/2025/2/8 3:37:50/

在移动开发中,高效展示数据列表至关重要。作为 React Native 开发者,我们可以使用多种强大的工具来完成这一任务。无论是 ScrollViewSectionList 还是 FlatList,React Native 都提供了一系列用于数据展示的组件。

然而,随着数据集的增长和性能需求的提高,我们需要更优化的解决方案。这时,Shopify 推出的 FlashList 应运而生,它相较于传统的列表组件,在性能上带来了显著提升。

本文将带你回顾 React Native 列表组件的演进过程,探讨 ScrollView 的局限性,以及 FlatListSectionList 的优化点,并深入了解最新的 FlashList 如何进一步提升性能和开发体验。


React Native 列表组件的演进

ScrollView

ScrollView 是 React Native 提供的最基础的列表组件之一,适用于简单的列表展示。然而,它的局限性也较为明显:它会一次性渲染所有子组件,即整个数据列表,不论数据量大小。

示例如下:

import { StyleSheet, Text, ScrollView } from 'react-native';
import { SafeAreaView, SafeAreaProvider } from 'react-native-safe-area-context';const data = ['Alice', 'Bob', 'Charlie', 'Diana', 'Edward', 'Fiona','George', 'Hannah', 'Ian', 'Jasmine', 'Kevin', 'Liam','Mia', 'Nathan', 'Olivia', 'Patrick', 'Quinn', 'Rebecca','Samuel', 'Tina', 'Quinn', 'Rebecca', 'Samuel', 'Tina',
];const App = () => {return (<SafeAreaProvider><SafeAreaView style={styles.container} edges={['top']}><ScrollView>{data.map((item, idx) => (<Text key={idx} style={styles.item}>{item}</Text>))}</ScrollView></SafeAreaView></SafeAreaProvider>);
};
export default App;const styles = StyleSheet.create({container: { flex: 1, paddingTop: 22 },item: { padding: 10, fontSize: 18, height: 44 },
});

ScrollView 的输出如下:

8f59f185e522a5c84335a2c7ba66fa41.png

尽管这种方式简单直观,但当数据量过大时,它会占用大量内存,因为 ScrollView 没有虚拟化或惰性加载的功能,导致渲染速度变慢,影响性能。


FlatList

为了解决 ScrollView 处理大数据集时的性能瓶颈,React Native 引入了 FlatList 组件。它采用虚拟化渲染技术,只渲染当前屏幕内可见的列表项,而屏幕外的项会被移除,从而大幅节省内存并提高渲染效率。

FlatList 的主要特性:
  • 支持水平滚动

  • 可添加列表头部和尾部

  • 支持分隔符

  • 下拉刷新

  • 滚动加载

  • 支持 scrollToIndex 方法

  • 支持多列布局

示例如下:

import { StyleSheet, Text, FlatList } from 'react-native';
import { SafeAreaView, SafeAreaProvider } from 'react-native-safe-area-context';const data = [...]; // 省略数据const App = () => {return (<SafeAreaProvider><SafeAreaView style={styles.container} edges={['top']}><FlatListdata={data}keyExtractor={(_, index) => index.toString()}renderItem={({ item }) => <Text style={styles.item}>{item}</Text>}/></SafeAreaView></SafeAreaProvider>);
};
export default App;const styles = StyleSheet.create({container: { flex: 1, paddingVertical: 22 },item: { padding: 10, fontSize: 18, height: 44 },
});

ScrollView 不同,FlatList 具备 keyExtractor 属性,可以自动为数据项生成唯一的 key,从而优化渲染效率。


SectionList

SectionListFlatList 类似,但它额外支持分组数据展示,适用于需要按类别归类的数据。例如,显示菜单、通讯录或分类列表时,SectionList 更加合适。

SectionList 主要特性:
  • 支持水平滚动

  • 支持列表头部和尾部

  • 支持分隔符

  • 支持分类标题

  • 下拉刷新

  • 滚动加载

  • 支持 scrollToIndex 方法

  • 支持多列布局

示例如下:

import { StyleSheet, Text, SectionList, View } from 'react-native';
import { SafeAreaView, SafeAreaProvider } from 'react-native-safe-area-context';const data = [{ title: '主食', data: ['披萨', '汉堡', '烩饭'] },{ title: '配菜', data: ['薯条', '洋葱圈', '炸虾'] },{ title: '饮料', data: ['水', '可乐', '啤酒'] },{ title: '甜点', data: ['芝士蛋糕', '冰淇淋'] },
];const App = () => (<SafeAreaProvider><SafeAreaView style={styles.container} edges={['top']}><SectionListsections={data}keyExtractor={(item, index) => item + index}renderItem={({ item }) => <Text style={styles.item}>{item}</Text>}renderSectionHeader={({ section: { title } }) => (<Text style={styles.header}>{title}</Text>)}/></SafeAreaView></SafeAreaProvider>
);
export default App;const styles = StyleSheet.create({container: { flex: 1 },item: { padding: 10, fontSize: 18 },header: { padding: 10, fontSize: 20, backgroundColor: '#ddd' },
});

在 iOS 端,SectionList 的分组标题默认会固定在顶部,提升用户体验。

40b52a9ddadb31042a8e0075452ffc67.png


FlashList

FlashListShopify 开发,针对大规模数据列表进行了极致优化。它不仅保留了 FlatList 的 API 设计,还提升了渲染速度,适用于超大数据集的高性能渲染。

FlashList 主要特性:
  • 优化渲染,速度提升 10 倍

  • 流畅滚动,内存占用更低

  • API 兼容 FlatList,迁移成本低

安装 FlashList:
# 使用 yarn
yarn add @shopify/flash-list# 使用 expo
npx expo install @shopify/flash-list

示例如下:

import { FlashList } from '@shopify/flash-list';<FlashListdata={data}renderItem={({ item }) => <Text style={styles.item}>{item}</Text>}keyExtractor={(_, index) => index.toString()}estimatedItemSize={20}
/>;

性能对比

组件渲染方式适用场景性能表现
ScrollView一次性渲染所有项小型数据集
FlatList虚拟化渲染大型数据集良好
SectionList虚拟化渲染分类数据集良好
FlashList高度优化超大数据集优异

总结

React Native 提供了丰富的列表组件,而 FlashList 以卓越的性能脱颖而出。如果你的应用需要处理大量数据,建议优先考虑 FlashList,它能提供更加流畅的用户体验,同时无需大幅修改代码。

最后:

React Hook 深入浅出

CSS技巧与案例详解

vue2与vue3技巧合集

VueUse源码解读


http://www.ppmy.cn/news/1570226.html

相关文章

二条命令,释放docker占用的存储空间

//删除空镜像 rootnode2:# docker images --quiet --filterdanglingtrue | xargs --no-run-if-empty docker rmi //清除缓存存储 rootnode2:# docker system prune WARNING! This will remove: all stopped containersall networks not used by at least one containerall da…

源路由 | 源路由网桥 / 生成树网桥

注&#xff1a;本文为 “源路由” 相关文章合辑。 未整理去重。 什么是源路由&#xff08;source routing&#xff09;&#xff1f; yzx99 于 2021-02-23 09:45:51 发布 考虑到一个网络节点 A 从路由器 R1 出发&#xff0c;可以经过两台路由器 R2、R3&#xff0c;到达相同的…

Unity 2D实战小游戏开发跳跳鸟 - 游戏开始UI界面及逻辑

有了游戏核心的计分逻辑之后,现在我们需要对游戏整体的流程进行控制和交互,这时需要实现游戏流程的UI界面,让用户可以通过UI的交互来开始游戏或者在跳跳鸟死亡时重新开始游戏等。 游戏开始界面 搭建一个游戏开始的UI界面,其结构如下所示。 首先创建一个空的游戏物体命名为…

【大数据技术】本机PyCharm远程连接虚拟机Python

本机PyCharm远程连接虚拟机Python 注意:本文需要使用PyCharm专业版。 pycharm-professional-2024.1.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本地PyCharm远程连接虚拟机,运行Python脚本,提高编程效率。 注意: …

C# 压缩图片并保存到本地

本文主要介绍如何使用C#将图片进行压缩并保存到本地。 接收一个原始图片的字节数组、需要保存的图片类型、输出路径和图片质量。方法首先将字节数组转换为一个内存流&#xff0c;然后使用Image.FromStream方法将内存流转换为一个Image对象。接下来&#xff0c;方法创建一个编码…

深度学习篇---深度学习中的超参数张量转换模型训练

文章目录 前言第一部分&#xff1a;深度学习中的超参数1. 学习率&#xff08;Learning Rate&#xff09;定义重要性常见设置 2. 批处理大小&#xff08;Batch Size&#xff09;定义重要性常见设置 3. 迭代次数&#xff08;Number of Epochs&#xff09;定义重要性常见设置 4. 优…

FreeRTOS学习 --- 列表和列表项

列表和列表项的简介 列表是 FreeRTOS 中的一个数据结构&#xff0c;概念上和链表有点类似&#xff0c;列表被用来跟踪 FreeRTOS中的任务。 列表项就是存放在列表中的项目 列表相当于链表&#xff0c;列表项相当于节点&#xff0c;FreeRTOS 中的列表是一个双向环形链表。 列表…

CEF132 编译指南 Windows 篇 - 安装 Git 和 Python (三)

1. 引言 在之前的文章里&#xff0c;我们成功地安装并配置了 Visual Studio 2022&#xff0c;为编译 CEF 132 做好了基础准备。接下来&#xff0c;我们需要安装 Git 和 Python 这两个至关重要的工具。它们在 CEF 132 的编译过程中扮演着不可或缺的角色&#xff1a;Git 用于获取…