SectionList
SectionList бол FlatList-тай адил гүйцэтгэлтэй боловч өгөгдлийг бүлгүүдэд хуваан харуулдаг. Тохиргооны апп дахь "Дансны мэдээлэл / Мэдэгдэл / Аюулгүй байдал" гэх мэт хэсгүүд, харилцагчийн жагсаалт дахь үсгийн дагуух бүлэглэлт — бүгд SectionList дээр баригддаг.
SectionList-н өгөгдлийн бүтэц
FlatList-аас гол ялгаа нь data prop биш sections prop ашигладаг явдал. Мөн мөр бүр title + data хосоос бүрдэнэ:
import { SectionList, View, Text, StyleSheet } from "react-native";
const SECTIONS = [
{
title: "JavaScript хэлнүүд",
data: ["JavaScript үндэс", "TypeScript үндэс"],
},
{
title: "Фреймворкүүд",
data: ["React үндэс", "Next.js үндэс", "React Native үндэс"],
},
{
title: "Бусад хэлнүүд",
data: ["Python үндэс", "Go үндэс", "PHP үндэс"],
},
];
export default function CourseList() {
return (
<SectionList
sections={SECTIONS}
keyExtractor={(item, index) => item + index}
renderItem={({ item }) => (
<View style={styles.row}>
<Text style={styles.rowText}>{item}</Text>
</View>
)}
renderSectionHeader={({ section }) => (
<View style={styles.header}>
<Text style={styles.headerText}>{section.title}</Text>
</View>
)}
style={styles.list}
contentContainerStyle={{ paddingBottom: 32 }}
/>
);
}
const styles = StyleSheet.create({
list: { flex: 1, backgroundColor: "#0b1120" },
header: {
backgroundColor: "#0b1120",
paddingHorizontal: 16,
paddingTop: 24,
paddingBottom: 8,
},
headerText: {
fontSize: 13,
fontWeight: "600",
color: "#475569",
textTransform: "uppercase",
letterSpacing: 1,
},
row: {
backgroundColor: "#0f172a",
paddingHorizontal: 16,
paddingVertical: 14,
borderBottomWidth: 1,
borderBottomColor: "#1e293b",
},
rowText: { fontSize: 15, color: "#f1f5f9" },
});
renderSectionHeader нь хэсэг бүрийн дээр гарчиг харуулдаг функц. renderItem-тэй ижил зарчим боловч item биш section объект хүлээн авдаг.
SectionList ба FlatList харьцуулбал
| | FlatList | SectionList |
| --------- | --------------------- | ---------------------------- |
| Өгөгдөл | data={массив} | sections={[{title, data}]} |
| Гарчиг | ListHeaderComponent | renderSectionHeader |
| Гүйцэтгэл | Маш өндөр | Маш өндөр |
| Хэрэглээ | Энгийн жагсаалт | Бүлэглэсэн жагсаалт |
Бодит жишээ: тохиргооны хуудас
import {
SectionList,
View,
Text,
TouchableOpacity,
StyleSheet,
} from "react-native";
const SETTINGS = [
{
title: "Бүртгэл",
data: [
{ id: "1", label: "Профайл засах", icon: "👤" },
{ id: "2", label: "Нууц үг солих", icon: "🔑" },
],
},
{
title: "Мэдэгдэл",
data: [
{ id: "3", label: "Push мэдэгдэл", icon: "🔔" },
{ id: "4", label: "И-мэйл мэдэгдэл", icon: "✉️" },
],
},
{
title: "Апп",
data: [
{ id: "5", label: "Харанхуй горим", icon: "🌙" },
{ id: "6", label: "Хэл солих", icon: "🌐" },
{ id: "7", label: "Хувилбарын мэдээлэл", icon: "ℹ️" },
],
},
];
export default function SettingsScreen() {
return (
<SectionList
sections={SETTINGS}
keyExtractor={(item) => item.id}
renderItem={({ item }) => (
<TouchableOpacity style={styles.row}>
<Text style={styles.icon}>{item.icon}</Text>
<Text style={styles.label}>{item.label}</Text>
<Text style={styles.arrow}>›</Text>
</TouchableOpacity>
)}
renderSectionHeader={({ section }) => (
<Text style={styles.sectionTitle}>{section.title}</Text>
)}
renderSectionFooter={() => <View style={styles.sectionGap} />}
stickySectionHeadersEnabled={false}
style={styles.list}
/>
);
}
const styles = StyleSheet.create({
list: { flex: 1, backgroundColor: "#0b1120" },
sectionTitle: {
fontSize: 13,
color: "#475569",
paddingHorizontal: 16,
paddingTop: 20,
paddingBottom: 6,
textTransform: "uppercase",
letterSpacing: 0.8,
},
row: {
flexDirection: "row",
alignItems: "center",
backgroundColor: "#0f172a",
paddingHorizontal: 16,
paddingVertical: 14,
borderBottomWidth: 1,
borderBottomColor: "#1e293b",
},
icon: { fontSize: 18, marginRight: 14 },
label: { flex: 1, fontSize: 15, color: "#f1f5f9" },
arrow: { fontSize: 20, color: "#475569" },
sectionGap: { height: 8 },
});
stickySectionHeadersEnabled={false} нь бүлгийн гарчиг дэлгэцийн дээд хэсэгт "наалдах" зан авирыг унтраана — iOS дээр анхдагчаар идэвхтэй байдаг.
renderSectionFooter нь хэсэг бүрийн доор нэмэлт агуулга харуулна — энд хэсгүүдийн хоорондын зайг нэмж байна.
Дараагийн хичээлд:
SectionList ашиглан бүлэглэсэн жагсаалт хийж сурлаа. Дараагийн хичээлд TextInput ба маягт — хэрэглэгчээс мэдээлэл авах, нэвтрэх маягт, хайлтын талбар гэх мэтийг хийнэ.