SectionList พร้อมส่วนหัว
จัดกลุ่มรายการเป็นส่วนต่าง ๆ ด้วย SectionList แสดงส่วนหัวของแต่ละกลุ่มแบบติดอยู่กับหน้าจอ และปรับแต่งตัวคั่นระหว่างรายการ
SectionList พร้อมส่วนหัว เป็นบทเรียน React Native Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Native Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Native Academy มีบทเรียนทั้งหมด 4 บทเรียน
บางส่วนของบทเรียนนี้ยังไม่ได้รับการแปล และแสดงเป็นภาษาอังกฤษ
When to Use SectionList
SectionList is the React Native component for displaying grouped lists — data divided into sections, each with its own header. It is ideal for contacts lists sorted alphabetically, settings screens with grouped options, or e-commerce categories. Like FlatList, it virtualizes rendering for performance.
SectionList Data Format
SectionList expects its sections prop to be an array of section objects. Each section object must have a data array containing the items for that section. You also typically include a title or other metadata to render the section header.
const SECTIONS = [
{
title: 'A',
data: [
{ id: '1', name: 'Alice' },
{ id: '2', name: 'Andrew' },
],
},
{
title: 'B',
data: [
{ id: '3', name: 'Bob' },
{ id: '4', name: 'Beth' },
],
},
];Rendering Items with renderItem
The renderItem function in SectionList receives an object with the current item, its index within the section, and the section object itself. This gives you access to both the item data and the enclosing section's metadata in the same render call.
const renderItem = ({ item, section }) => (
<View style={styles.row}>
<Text>{item.name}</Text>
<Text style={styles.sectionLabel}>{section.title}</Text>
</View>
);Rendering Section Headers
Pass a renderSectionHeader function to display a header above each section. The function receives { section } — the current section object. Returning a View with a colored background makes the header stand out from the items below it.
const renderSectionHeader = ({ section }) => (
<View style={styles.sectionHeader}>
<Text style={styles.sectionTitle}>{section.title}</Text>
</View>
);
<SectionList
sections={SECTIONS}
renderItem={renderItem}
renderSectionHeader={renderSectionHeader}
keyExtractor={(item) => item.id}
/>Sticky Section Headers
By default, section headers scroll with the list. Set stickySectionHeadersEnabled to true to make headers stick to the top of the screen as you scroll past them — the same behavior you see in the iOS Contacts app. This is set to true by default on iOS and false on Android.
<SectionList
sections={SECTIONS}
renderItem={renderItem}
renderSectionHeader={renderSectionHeader}
keyExtractor={(item) => item.id}
stickySectionHeadersEnabled={true}
/>Section Footer with renderSectionFooter
Use renderSectionFooter to render content after the last item in each section. This is useful for showing a 'View all' link or a count of remaining items below a truncated group. The function receives the same { section } argument as renderSectionHeader.
const renderSectionFooter = ({ section }) => (
<TouchableOpacity>
<Text style={styles.viewAll}>
View all {section.data.length} {section.title} contacts
</Text>
</TouchableOpacity>
);Item Separators in SectionList
Like FlatList, SectionList supports ItemSeparatorComponent to render dividers between items within a section. SectionList also provides SectionSeparatorComponent to render a separator between the end of one section (or its footer) and the start of the next section's header.
const ItemSeparator = () => <View style={styles.separator} />;
const SectionSeparator = () => <View style={styles.sectionSeparator} />;
<SectionList
sections={SECTIONS}
renderItem={renderItem}
renderSectionHeader={renderSectionHeader}
keyExtractor={(item) => item.id}
ItemSeparatorComponent={ItemSeparator}
SectionSeparatorComponent={SectionSeparator}
/>A Full SectionList Example
Bringing it all together: define your sections data, provide renderItem and renderSectionHeader, set a keyExtractor, and optionally enable sticky headers. This pattern covers the majority of grouped list use cases in production apps.
import { SectionList, View, Text, StyleSheet } from 'react-native';
export default function ContactsScreen() {
return (
<SectionList
sections={SECTIONS}
keyExtractor={(item) => item.id}
renderItem={({ item }) => (
<View style={styles.row}><Text>{item.name}</Text></View>
)}
renderSectionHeader={({ section }) => (
<View style={styles.header}><Text style={styles.headerText}>{section.title}</Text></View>
)}
stickySectionHeadersEnabled
/>
);
}Building Data for SectionList from a Flat Array
Often your API returns a flat array. You need to group items by a common property before passing them to SectionList. Use Array.reduce to build a map, then convert it to the sections format. Sort the sections alphabetically for a predictable order.
function groupByFirstLetter(contacts) {
const map = contacts.reduce((acc, contact) => {
const letter = contact.name[0].toUpperCase();
if (!acc[letter]) acc[letter] = [];
acc[letter].push(contact);
return acc;
}, {});
return Object.keys(map).sort().map((key) => ({
title: key,
data: map[key],
}));
}Scrolling to a Specific Section
Use a ref on the SectionList and call scrollToLocation to jump to a specific item or section header. This is essential for alphabetic index bars (like the sidebar in iOS Contacts) where tapping a letter scrolls the list to that section.
const sectionListRef = useRef(null);
const scrollToSection = (sectionIndex) => {
sectionListRef.current?.scrollToLocation({
sectionIndex,
itemIndex: 0,
animated: true,
});
};
<SectionList ref={sectionListRef} sections={SECTIONS} ... />Performance Tips for SectionList
The same performance rules that apply to FlatList apply to SectionList. Stabilize renderItem and renderSectionHeader with useCallback. Avoid creating new objects inline in the sections prop on every render — memoize the processed sections data with useMemo.
const sections = useMemo(
() => groupByFirstLetter(contacts),
[contacts]
);
const renderItem = useCallback(({ item }) => (
<Row item={item} />
), []);Quick Check
Test your understanding of SectionList with headers from this lesson.
Lesson Recap
In this lesson you learned: SectionList sections prop takes an array of objects each with a data array, renderSectionHeader renders a title above each group, and stickySectionHeadersEnabled pins headers to the top as users scroll. Next up we build a complete Contacts List App combining SectionList, search, and pull-to-refresh.
คำถามที่พบบ่อย
บทเรียน “SectionList พร้อมส่วนหัว” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “SectionList พร้อมส่วนหัว” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Native Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Native Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “SectionList พร้อมส่วนหัว”
จัดกลุ่มรายการเป็นส่วนต่าง ๆ ด้วย SectionList แสดงส่วนหัวของแต่ละกลุ่มแบบติดอยู่กับหน้าจอ และปรับแต่งตัวคั่นระหว่างรายการ คุณปฏิบัติ React Native Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Native Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Native Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “SectionList พร้อมส่วนหัว” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Native Academy นี้ได้ไหม
ได้ บทเรียน React Native Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ข้อมูล FlatList, renderItem และ keyExtractor
- การดึงเพื่อรีเฟรชและโหลดเพิ่มเติม
- SectionList พร้อมส่วนหัว
- การสร้างแอปรายการรายชื่อติดต่อ