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

server/2025/2/7 22:50:02/

在移动开发中,高效展示数据列表至关重要。作为 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/server/165783.html

相关文章

鸿蒙生态潮起:开发者的逐浪之旅

鸿蒙生态潮起&#xff1a;开发者的逐浪之旅 在全球科技的澎湃浪潮中&#xff0c;鸿蒙生态宛如一座正在崛起的新大陆&#xff0c;熠熠生辉&#xff0c;吸引着无数开发者扬帆起航&#xff0c;探寻其中蕴藏的无限机遇&#xff0c;也直面诸多挑战。 鸿蒙生态的机遇&#xff0c;首先…

Tomcat 的几种部署方式

Apache Tomcat 是一个广泛使用的开源 Servlet 容器&#xff0c;用于部署和运行 Java Web 应用程序。Tomcat 支持多种部署方式&#xff0c;每种方式都有其特点和适用场景。以下是几种常见的 Tomcat 部署方式的详细讲解&#xff1a; 1. 通过 webapps 目录自动部署 这是最简单也…

如何确保爬虫不会违反平台规则?

在使用爬虫获取数据时&#xff0c;确保爬虫行为不违反平台规则和法律法规至关重要。以下是一些关键的合规建议&#xff0c;帮助你确保爬虫行为合法、合规&#xff1a; 1. 遵守法律法规 在使用爬虫技术之前&#xff0c;必须了解并遵守相关法律法规&#xff0c;如《网络安全法》…

【hot100】073矩阵置零

一、思路 此题要求原地置0&#xff0c;但我看了评论区很多人说没有必要&#xff0c;现在普遍时间优先于空间&#xff0c;所以采用了O&#xff08;mn&#xff09;的空间复杂度做法 二、记忆 1.标记矩阵的思路 2. int y matrix.length; int x matrix[0].length; 三、代码…

JavaScript 中的 CSS 与页面响应式设计

JavaScript 中的 CSS 与页面响应式设计 JavaScript 中的 CSS 与页面响应式设计1. 引言2. JavaScript 与 CSS 的基本概念2.1 CSS 的作用2.2 JavaScript 的作用 3. 动态控制样式&#xff1a;JavaScript 修改 CSS 的方法3.1 使用 document.styleSheets API3.2 使用 classList 修改…

服务器升级nginx版本

有个老项目被网安提醒了。说是nginx 版本 0.6.18 至 1.20.0 的一个安全漏洞。让我们升级nginx。 先看看nginx版本 nginx -v 是1.18的。 更新系统包 适用于基于 Debian/Ubuntu 的系统&#xff1a; sudo apt update sudo apt upgrade nginx适用于基于 RHEL/CentOS 的系统&am…

交易一张股指期货需要多少钱?

咱们先来说说交易一张股指期货得花多少钱。这个其实挺简单的&#xff0c;就是用一个公式来算&#xff1a;股指期货保证金合约价值&#xff08;指数点位合约乘数&#xff09;保证金比例交易手数。 举个例子&#xff0c;假设沪深300股指期货的指数点位是3842.22点&#xff0c;合…

YOLO目标检测数据集划分代码

使用自制数据集训练YOLO目标检测算法前&#xff0c;需要对数据集进行划分&#xff0c;以下代码可以将数据集的图片和标签分别保存 import os import shutil import numpy as np from tqdm import tqdmdef split_dataset(images_dir, labels_dir, train_ratio0.7, val_ratio0.2…