React Native 全栈开发实战班 - 列表与滚动视图

在移动应用中,列表和滚动视图是非常常见的 UI 组件。React Native 提供了多种组件来处理列表和滚动需求,包括 ScrollView, FlatList, SectionList 等。本小节将详细介绍这些组件的使用方法、优缺点以及适用场景。

2.1 ScrollView

ScrollView 是一个通用的可滚动容器组件,适用于内容较少或内容数量有限的情况。它可以垂直或水平滚动,并且可以嵌套其他组件。

优点:

  • 简单易用,适合快速实现滚动功能。
  • 支持水平和垂直滚动。
  • 可以嵌套其他组件,实现复杂的布局。

缺点:

  • 不适合长列表,因为 ScrollView 会一次性渲染所有子组件,导致性能问题。

常用属性:

  • contentContainerStyle:定义内容容器的样式。
  • horizontal:是否水平滚动。
  • showsVerticalScrollIndicator:是否显示垂直滚动条。
  • showsHorizontalScrollIndicator:是否显示水平滚动条。
  • onScroll:滚动事件处理函数。

示例:

javascript 复制代码
import React from 'react';
import { ScrollView, Text, View, StyleSheet } from 'react-native';

const ScrollViewExample = () => {
  return (
    <ScrollView contentContainerStyle={styles.container}>
      <Text style={styles.text}>内容1</Text>
      <Text style={styles.text}>内容2</Text>
      <Text style={styles.text}>内容3</Text>
      <Text style={styles.text}>内容4</Text>
      <Text style={styles.text}>内容5</Text>
      {/* 更多内容 */}
    </ScrollView>
  );
};

const styles = StyleSheet.create({
  container: {
    padding: 10,
  },
  text: {
    fontSize: 16,
    marginVertical: 5,
  },
});

export default ScrollViewExample;

水平滚动示例:

javascript 复制代码
import React from 'react';
import { ScrollView, Text, View, StyleSheet } from 'react-native';

const HorizontalScrollViewExample = () => {
  return (
    <ScrollView horizontal contentContainerStyle={styles.container}>
      <View style={styles.item}>
        <Text>Item 1</Text>
      </View>
      <View style={styles.item}>
        <Text>Item 2</Text>
      </View>
      <View style={styles.item}>
        <Text>Item 3</Text>
      </View>
      {/* 更多内容 */}
    </ScrollView>
  );
};

const styles = StyleSheet.create({
  container: {
    padding: 10,
  },
  item: {
    width: 150,
    height: 100,
    backgroundColor: '#f0f0f0',
    marginRight: 10,
    justifyContent: 'center',
    alignItems: 'center',
  },
});

export default HorizontalScrollViewExample;
2.2 FlatList

FlatList 是一个高性能的列表组件,适用于渲染长列表数据。它通过虚拟化技术,只渲染当前可见区域的子组件,从而提高性能。

优点:

  • 高性能,适合长列表。
  • 支持懒加载和虚拟化。
  • 支持分页加载。
  • 支持水平滚动。

缺点:

  • 需要数据源为数组形式。
  • 不支持分组列表。

常用属性:

  • data:列表数据源。
  • renderItem:定义列表项的渲染函数。
  • keyExtractor:定义列表项的唯一键。
  • ListHeaderComponent:定义列表头部组件。
  • ListFooterComponent:定义列表底部组件。
  • onEndReached:列表滚动到末尾时触发的函数,用于分页加载。
  • onEndReachedThreshold:触发 onEndReached 的阈值。

示例:

javascript 复制代码
import React, { useState, useEffect } from 'react';
import { FlatList, Text, View, StyleSheet, ActivityIndicator } from 'react-native';

const FlatListExample = () => {
  const [data, setData] = useState([]);
  const [page, setPage] = useState(1);
  const [loading, setLoading] = useState(false);

  const fetchData = async () => {
    setLoading(true);
    const response = await fetch(`https://example.com/api/items?page=${page}`);
    const newData = await response.json();
    setData([...data, ...newData]);
    setPage(page + 1);
    setLoading(false);
  };

  useEffect(() => {
    fetchData();
  }, []);

  const renderItem = ({ item }) => (
    <View style={styles.item}>
      <Text>{item.title}</Text>
    </View>
  );

  const renderFooter = () => {
    if (!loading) return null;
    return (
      <View style={styles.footer}>
        <ActivityIndicator size="large" />
      </View>
    );
  };

  return (
    <FlatList
      data={data}
      renderItem={renderItem}
      keyExtractor={(item) => item.id}
      onEndReached={fetchData}
      onEndReachedThreshold={0.5}
      ListFooterComponent={renderFooter}
    />
  );
};

const styles = StyleSheet.create({
  item: {
    padding: 10,
    borderBottomWidth: 1,
    borderColor: '#ccc',
  },
  footer: {
    padding: 10,
    alignItems: 'center',
  },
});

export default FlatListExample;
2.3 SectionList

SectionList 是一个支持分组列表的组件,适用于需要分组显示的数据。

优点:

  • 支持分组列表。
  • 高性能,适合长列表。
  • 支持懒加载和虚拟化。

缺点:

  • 需要数据源为分组数组形式。

常用属性:

  • sections:分组数据源。
  • renderItem:定义列表项的渲染函数。
  • renderSectionHeader:定义分组头部的渲染函数。
  • keyExtractor:定义列表项的唯一键。
  • ListHeaderComponent:定义列表头部组件。
  • ListFooterComponent:定义列表底部组件。

示例:

javascript 复制代码
import React from 'react';
import { SectionList, Text, View, StyleSheet } from 'react-native';

const SectionListExample = () => {
  const sections = [
    { title: 'A', data: ['Apple', 'Apricot', 'Avocado'] },
    { title: 'B', data: ['Banana', 'Blueberry', 'Blackberry'] },
    { title: 'C', data: ['Cherry', 'Coconut', 'Cranberry'] },
    // 更多分组
  ];

  const renderItem = ({ item }) => (
    <View style={styles.item}>
      <Text>{item}</Text>
    </View>
  );

  const renderSectionHeader = ({ section }) => (
    <View style={styles.sectionHeader}>
      <Text style={styles.sectionTitle}>{section.title}</Text>
    </View>
  );

  return (
    <SectionList
      sections={sections}
      renderItem={renderItem}
      renderSectionHeader={renderSectionHeader}
      keyExtractor={(item, index) => item + index}
    />
  );
};

### 导师答疑
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0fe9d8bca58b4ecbb6921ea6fe47cfab.jpeg)
相关推荐
系统集成-鹰翔11 小时前
ERP图片改名后仍命中识别缓存:缓存键、十分钟到期与调用计数
javascript·经验分享·后端
FlyWIHTSKY12 小时前
vue2和vue3有什么区别,用法上有哪些区别
前端·javascript·vue.js
程序员大阳14 小时前
副队长JavaScript教程(66)-本地存储实战:待办事项网页的开发
javascript·json·实战·待办事项·本地存储·案例
Dream-Y.ocean14 小时前
鸿蒙PC平台逻控 PLC 编辑器适配实战:基于 Electron 壳方案的纯 JavaScript 梯形图编程与仿真引擎开发
javascript·编辑器·harmonyos
前端小D16 小时前
JS核心底层
前端·javascript
Dovis(誓平步青云)17 小时前
启元 T1 Pro 人机相声搭档:语音-触摸双通道的启元机器人节奏引擎设计
开发语言·前端·javascript·microsoft·交互
codeejun18 小时前
每日一Go·MySQL-11、覆盖索引 & 回表原理
javascript·数据库·mysql
用户2986985301419 小时前
React 前端将 Excel 工作表导出为图片的技术实践
javascript·react.js·excel
麦麦麦当劳大王1 天前
【油猴脚本】Boss直聘 岗位职责复制
开发语言·前端·javascript
只睡四小时1 天前
Three.js Sub-tick:漏判 60.7%→0
开发语言·javascript·性能优化·ecmascript·游戏开发·three.js·碰撞检测