React Native FlatList

摘要: 在本教程中,您将学习如何使用 React Native FlatList 组件来高效地渲染项目列表。

React Native FlatList 组件介绍

ScrollView 组件一次性渲染所有嵌套组件,即使其中一些组件在屏幕上不可见。当您有大量嵌套组件时,这将非常低效。

为了高效地渲染大型列表,您可以使用FlatList 组件。FlatList 组件懒加载嵌套组件,因为它们出现在屏幕上。

此外,FlatList 组件支持许多有用的功能。

  • 以水平或垂直方式显示列表。
  • 在多列中渲染列表项目。
  • 支持列表标题、列表页脚和项目分隔符。
  • 下拉刷新。
  • 滚动加载。
  • 支持 ScrollToIndex。
  • 可配置的可视性回调。

要使用FlatList 组件,您需要按照以下步骤进行操作。

首先,从react-native 库中导入FlatList 组件。

import { FlatList } from 'react-native';Code language: JavaScript (javascript)

其次,将参数传递给 data 和renderItem 道具。

<FlatList
   data={items}
   renderItem={renderItem}
/>Code language: JavaScript (javascript)

FlatList 只需要两个道具

  • data 是要渲染的项目数组(或类似数组)。
  • renderItem 是一个回调函数,它定义了如何渲染每个项目。

renderItem 回调接收一个对象并返回一个 JSX 元素,它定义了如何渲染每个项目。

renderItem({ item, index, separators})Code language: JavaScript (javascript)

在这个renderItem 函数中。

  • item 是 data 数组中的一个项目。
  • index 存储item 在 data 数组中的索引。
  • separators 是一个对象,它提供方法来处理项目分隔符的渲染。在实践中,您很少使用此参数。

FlatList 有一个可选但重要的道具,名为keyExtrator

keyExtractor 定义了一个函数,该函数为给定项目提取一个唯一的键。React Native 使用该键进行缓存和跟踪项目重新排序。

默认情况下,keyExtractor 使用项目的keyid 属性(item.iditem.key),然后回退到使用index。因此,如果列表中的项目具有idkey 属性,您可以忽略keyExtractor 道具。

我们将演示如何使用FlatList 组件来渲染以下项目。

export const items = [
    { id: 1, name: 'Apple', emoji: '🍎' },
    { id: 2, name: 'Banana', emoji: '🍌' },
    { id: 3, name: 'Cherry', emoji: '🍒' },
    { id: 4, name: 'Grapes', emoji: '🍇' },
    { id: 5, name: 'Carrot', emoji: '🥕' },
    { id: 6, name: 'Potato', emoji: '🥔' },
    { id: 7, name: 'Broccoli', emoji: '🥦' },
    { id: 8, name: 'Spinach', emoji: '🥬' },
    { id: 9, name: 'Milk', emoji: '🥛' },
    { id: 10, name: 'Cheese', emoji: '🧀' },
    { id: 12, name: 'Butter', emoji: '🧈' }
];Code language: JavaScript (javascript)

基本 FlatList 示例

以下示例说明了如何使用FlatList 组件来渲染项目。

import { View, Text, StyleSheet, FlatList, SafeAreaView } from 'react-native';
import { items } from './data/items';


const App = () => {
    const renderItem = ({ item }) => {
        return <View style={styles.listItem}>
            <Text style={styles.listTitle}>{item.name}</Text>
            <Text style={styles.listTitle}>{item.emoji}</Text>
        </View>
    }

    return (
        <SafeAreaView style={styles.container}>
            <FlatList
                style={styles.list}
                data={items}
                renderItem={renderItem} />
        </SafeAreaView>
    )
}


const styles = StyleSheet.create({
    container: {
        flex: 1,
    },
    list: {
        flex: 0.5,
        fontSize: 16,
    },
    listItem: {
        flexDirection: 'row',
        justifyContent: 'space-between',
        padding: 8,
    },
    listTitle: {
        fontSize: 40
    },
});


export default App;Code language: JavaScript (javascript)

输出

它是如何工作的。

首先,使用FlatList 组件来渲染项目。

<FlatList
   style={styles.list}
   data={items}
   renderItem={renderItem} />Code language: HTML, XML (xml)

在这段代码中,我们将items 数组、renderItem 函数和styles.list 传递给FlatList 组件。

其次,定义renderItem 函数来渲染每个项目。

const renderItem = ({ item }) => {
   return <View style={styles.listItem}>
            <Text style={styles.listTitle}>{item.name}</Text>
            <Text style={styles.listTitle}>{item.emoji}</Text>
        </View>
}Code language: JavaScript (javascript)

renderItem 函数接收一个项目,并分别渲染其nameemjoi

要将nameemoji 显示为单独的列,我们将flexDirection 设置为'row',将justifyContent 设置为'space-between'

显示水平列表

以下示例使用FlatList 组件来显示水平列表。

import { View, Text, StyleSheet, FlatList, SafeAreaView } from 'react-native';
import { items } from './data/items';


const App = () => {

    const renderItem = ({ item }) => {
        return <View style={styles.listItem}>
            <Text style={styles.listEmoji}>{item.emoji}</Text>
            <Text style={styles.listTitle}>{item.name}</Text>
        </View>
    }

    return (
        <SafeAreaView style={styles.container}>
            <FlatList
                style={styles.list}
                horizontal
                data={items}
                renderItem={renderItem} />
        </SafeAreaView>
    )
}


const styles = StyleSheet.create({
    container: {
        flex: 1
    },
    list: {
        fontSize: 16,

    },
    listItem: {
        alignItems: 'center',
        height: 120,
        padding: 16,
        backgroundColor: '#efefef',
        borderColor: '#ccc',
        borderRadius: 16,
        borderWidth: 1,
        marginHorizontal: 8,
        marginVertical: 4,

    },
    listEmoji: {
        fontSize: 48,
    },
    listTitle: {
        fontSize: 18,
    },
});


export default App;Code language: JavaScript (javascript)

显示多列

以下示例使用 numColumns 道具将 FlatList 组件的列数设置为三。

import { View, Text, StyleSheet, FlatList, SafeAreaView } from 'react-native';
import { items } from './data/items';


const App = () => {

    const renderItem = ({ item }) => {
        return <View style={styles.listItem}>
            <Text style={styles.listEmoji}>{item.emoji}</Text>

        </View>
    }

    return (
        <SafeAreaView style={styles.container}>
            <FlatList
                style={styles.list}
                data={items}
                keyExtractor={item => item.id}
                renderItem={renderItem}
                numColumns={3}

            />
        </SafeAreaView>
    )
}


const styles = StyleSheet.create({
    container: {
        flex: 1,
    },

    list: {
        fontSize: 16,
    },
    listItem: {
        flexDirection: 'row',
        justifyContent: 'space-between',
        padding: 8,
        borderWidth: 1,
        borderColor: '#ccc',
        borderRadius: 8,
        marginHorizontal: 8,
        marginVertical: 4,
    },
    listEmoji: {
        fontSize: 48,
    },

});

export default App;
Code language: JavaScript (javascript)

输出

带有标题、页脚和项目分隔符的 FlatList

以下示例展示了如何为FlatList 渲染列表标题、列表页脚和项目分隔符。

import { View, Text, StyleSheet, FlatList, SafeAreaView } from 'react-native';
import { items } from './data/items';


const App = () => {

    const renderItem = ({ item }) => {
        return <View style={styles.item}>
            <Text style={styles.itemTitle}>{item.name}</Text>
            <Text style={styles.itemTitle}>{item.emoji}</Text>
        </View>
    }

    const header = () => (
        <Text style={styles.header}>My Favorite List</Text>

    );

    const footer = () => (
        <Text style={styles.footer}>Fruit, drinks and food.</Text>
    );

    const separator = () => (
        <View style={styles.separator} />
    );

    return (
        <SafeAreaView style={styles.container}>
            <FlatList
                style={styles.list}
                data={items}
                renderItem={renderItem}
                ListHeaderComponent={header}
                ListFooterComponent={footer}
                ItemSeparatorComponent={separator}
            />
        </SafeAreaView>
    )
}



const styles = StyleSheet.create({
    container: {
        flex: 1,
    },

    list: {
        flex: 0.5,
        fontSize: 16,
    },
    header: {
        fontSize: 32,
        marginVertical: 12,
        padding: 8,
    },
    footer: {
        padding: 8,
    },
    item: {
        flexDirection: 'row',
        justifyContent: 'space-between',
        padding: 8,
    },
    itemTitle: {
        fontSize: 24
    },
    separator: {
        height: 1,
        width: '100%',
        backgroundColor: '#ccc',
    },
});


export default App;Code language: JavaScript (javascript)

输出

在此示例中,我们使用ListHeaderComponentListFooterComponentItemSeparatorComponent 道具来为FlatList 渲染列表标题、列表页脚和项目分隔符。

总结

  • 使用FlatList 组件来高效地渲染大型列表。
  • FlatList 组件需要 data 和 renderItem 道具。data 代表要渲染的项目列表,renderItem 定义了如何渲染每个项目。
本教程对您有帮助吗?