Loading [MathJax]/jax/output/CommonHTML/config.js
部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >React Native 列表组件:FlashList、FlatList 及更多

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

作者头像
前端小智@大迁世界
发布于 2025-02-06 13:09:57
发布于 2025-02-06 13:09:57
56100
代码可运行
举报
文章被收录于专栏:终身学习者终身学习者
运行总次数:0
代码可运行

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

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

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


React Native 列表组件的演进

ScrollView

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

示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 的输出如下:

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


FlatList

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

FlatList 的主要特性:
  • 支持水平滚动
  • 可添加列表头部和尾部
  • 支持分隔符
  • 下拉刷新
  • 滚动加载
  • 支持 scrollToIndex 方法
  • 支持多列布局

示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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']}>
        <FlatList
          data={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 方法
  • 支持多列布局

示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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']}>
      <SectionList
        sections={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 的分组标题默认会固定在顶部,提升用户体验。


FlashList

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

FlashList 主要特性:
  • 优化渲染,速度提升 10 倍
  • 流畅滚动,内存占用更低
  • API 兼容 FlatList,迁移成本低
安装 FlashList:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 使用 yarn
yarn add @shopify/flash-list

# 使用 expo
npx expo install @shopify/flash-list

示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { FlashList } from '@shopify/flash-list';

<FlashList
  data={data}
  renderItem={({ item }) => <Text style={styles.item}>{item}</Text>}
  keyExtractor={(_, index) => index.toString()}
  estimatedItemSize={20}
/>;

性能对比

组件

渲染方式

适用场景

性能表现

ScrollView

一次性渲染所有项

小型数据集

FlatList

虚拟化渲染

大型数据集

良好

SectionList

虚拟化渲染

分类数据集

良好

FlashList

高度优化

超大数据集

优异

总结

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用FlatList构建列表
接着上一篇 使用react-native-tab-navigator切换页面 当前首页页面内容是空的,只有一个背景色。下面我们来添加些内容。 这里使用 FlatList 来渲染列表。(注:很多教程包含视频中是使用 ListView 构建内容列表的。这个已经被弃用) 步骤如下图非常简单:
mafeifan
2018/09/10
1.9K0
使用FlatList构建列表
React Native列表之FlatList开发实用教程
在APP开发过程中,列表可谓是页面最重要的一种展现形式了,几乎每一个APP都离不了列表,那么在这篇文章中将向大家分享在React Native中该如何实现列表,以及FlatList的原理和实用指南。
CrazyCodeBoy
2019/12/10
7.1K0
React Native列表之FlatList开发实用教程
react-native布局与组件
一款好的App离不开漂亮的布局,RN中的布局方式采⽤的是FlexBox(弹性布局) 。
一粒小麦
2019/09/17
5.7K0
react-native布局与组件
React Native学习笔记(三)—— 样式、布局与核心组件
React Native 有一个内置的命令行界面,你可以用它来生成一个新项目。您可以使用 Node.js 附带的 访问它,而无需全局安装任何内容。让我们创建一个名为“AwesomeProject”的新 React Native 项目:npx
张果
2023/04/12
14.9K0
React Native学习笔记(三)—— 样式、布局与核心组件
React Native 上开发 VisionOS App 初步尝试
我们修改一下 App.tsx,比如修改下 step one他们的文案 ,然后保存看看。可以看到直接保存,就更新了,这说明热更新还是好使的。
老码小张
2024/03/05
3710
React Native 上开发 VisionOS App 初步尝试
React-Native 版高仿淘宝、京东商城首页、商品分类页面
高仿淘宝、京东等商城首页、商品分类页面,正在做商城项目的同学有福啦,看看是你们想要的效果吗?
子晋
2022/01/18
3.4K0
React-Native 版高仿淘宝、京东商城首页、商品分类页面
React Native 核心技术知识点快速入门
Node.js 是 JavaScript 的运行环境,npm 是 Node.js 的包管理器。可以从 Node.js 官方网站 下载并安装适合你操作系统的版本。
威哥爱编程
2025/02/28
4800
如何在React Native中使用FlatList组件
在React Native开发中,经常需要用到列表展示的功能。FlatList组件是React Native中用来实现列表功能的核心组件之一,它能够高效地渲染大量数据,并且支持懒加载,提高了用户体验。本文将介绍如何在React Native中使用FlatList组件。
泽霖
2023/11/29
1.4K0
React Native 性能优化指南
2020 年谈 React Native,在日新月异的前端圈,可能算比较另类了。文章动笔之前我也犹豫过,但是想到写技术文章又不是赶时髦,啥新潮写啥,所以还是动笔写了这篇 React Native 性能优化的文章。
卤代烃
2020/07/09
5.6K1
React Native跨平台开发实战:从零到一
最近在学习React Native跨平台开发,从零开始如何开发第一个基础应用并打包发布:
天涯学馆
2024/06/02
6320
RN项目第二节 -- 首页实现
一、微组件的封装 每个页面的导航都会有不同的样式或者图片,为了实现代码的复用性,可以将导航统一封装成一个微小组件。 封装的Item需要有可点击事件,需要显示文字和图片。 import React,
谦谦君子修罗刀
2018/06/19
6.8K0
【React Native 安卓开发】----侧边栏的实现DrawerLayoutAndroid以及第三方框架react-native-side-menu的使用【第六篇】
做过安卓原生开发的童鞋们应该都做过侧边栏这个东西,而且对于开源框架SlidingMenu和android官方侧滑菜单DrawerLayout应该都不陌生。 那么今天也在这里给大家介绍一下React-Native中的侧滑菜单DrawerLayoutAndroid和第三方框架react-native-side-menu。
先知先觉
2019/01/21
7.1K0
react-native导航组件
创建 src/navigation.js 文件,在其中添加一个导航器组件,以及两个屏幕组件 HomeScreen 和 ProfileScreen。同时在这两个屏幕组件中添加一个按钮,用于导航到另一个屏幕组件。
kongxx
2024/06/17
2640
react native简单入门
只执行一次: constructor、componentWillMount、componentDidMount 执行多次:render 、子组件的componentWillReceiveProps、componentWillUpdate、componentDidUpdate 有条件的执行:componentWillUnmount(页面离开,组件销毁时) 不执行的:根组件(ReactDOM.render在DOM上的组件)的componentWillReceiveProps(因为压根没有父组件给传递props)
前端迷
2019/12/05
3.9K0
react native简单入门
从零开始构建React Native数字键盘功能
现代移动应用程序在入门过程中经常涉及一个步骤,你需要输入发送到你的电子邮件或手机号码的验证码 PIN。有时,你需要使用类似于分割 OTP 输入字段的东西来输入 PIN。另一种输入验证码 PIN 的方式是使用拨号盘。
前端小智@大迁世界
2024/03/01
9790
从零开始构建React Native数字键盘功能
React Native UI界面还原,组件布局与动画效果
写React Native UI和写 Android XML layout 布局 ,个人感觉是大同小异
周陆军博客
2023/04/09
5K0
MobX 在 React Native开发中的应用
MobX 是一款精准的状态管理工具库,如果你在 React 和 React Native 应用中使用过 Flux、Alt、Redux 和 Reflux,那毫不犹豫地说,MobX 的简单性将成为你状态管
xiangzhihong
2018/01/26
13.1K0
React-Native 在 SectionList 组件中实现九宫格布局
随着 ReactNative 的不断更新,ListView 这个组件逐步被 FlatList 和 SectionList 取代。ListView 从出生之后就饱受诟病,比如不支持单独的头部和尾部组件,并且当列表数据源过大时,占用内存明显增加性能受到影响,无法达到 60FPS 。在这样的背景下,FlatList 和 SectionList 就应运而生了,FlatList 用于无分组的列表,而 SectionList 用于有分组的列表。
Originalee
2019/04/17
4.2K0
React-Native 在 SectionList 组件中实现九宫格布局
React Native之轻量级存储AsyncStorage
AsyncStorage是一个简单的、异步的、持久化的以键值对形式进行数据存储的存储系统,对于App来说是全局性的。它的作用等价于iOS的NSUserDefaluts或Android的SharedPreferences,使用AsyncStorage用来替换老旧的LocalStorage。 方法 它有很多方法,每一个方法都有回调函数,第一个参数是错误对象,错了就是展示错误信息,否则为null。都会返回一个Promise对象。 static getItem(key:string , callback:(erro
xiangzhihong
2018/01/26
2.9K0
在 React Native 中原生实现动态导入
在React Native社区中,原生动态导入一直是期待已久的功能。在React Native 0.72 版本发布之前,只能通过第三方库和其他变通方法实现动态导入,例如使用 React.lazy() 和 Suspense 函数。现在,动态导入已经成为React Native框架的原生部分。
前端小智@大迁世界
2024/02/21
9070
推荐阅读
相关推荐
使用FlatList构建列表
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验