摘要: 在本教程中,您将学习如何使用 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 使用项目的key 或id 属性(item.id 或item.key),然后回退到使用index。因此,如果列表中的项目具有id 或key 属性,您可以忽略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 函数接收一个项目,并分别渲染其name 和emjoi。
要将name 和emoji 显示为单独的列,我们将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)输出
在此示例中,我们使用ListHeaderComponent、ListFooterComponent 和ItemSeparatorComponent 道具来为FlatList 渲染列表标题、列表页脚和项目分隔符。
总结
- 使用
FlatList组件来高效地渲染大型列表。 FlatList组件需要 data 和 renderItem 道具。data 代表要渲染的项目列表,renderItem 定义了如何渲染每个项目。