728x90
728x90
FlatList
들어가며
- 리액트 네이티브(React Native)의
FlatList
컴포넌트에 대해 정리해본다.

FlatList
개념
- 효율적으로 대량의 스크롤 가능한 항목을 렌더링하기 위해 사용되는 컴포넌트
- 최적화된 가상 스크롤링 기능을 제공하여 성능 문제를 줄이고, 스크롤 시 필요한 항목만 렌더링한다.
ScrollView
컴포넌트와의 차이점
주요 속성
속성 | 설명 |
data |
- 렌더링할 데이터 배열(Array)을 전달 - 배열의 각 요소는 렌더링될 항목의 데이터 |
renderItem |
- 데이터를 어떻게 렌더링할지 정의하는 함수 - 매개변수로 { item, index } 형태의 객체를 받는다. |
keyExtractor |
- 각 항목의 고유 키를 반환하는 함수 - 기본적으로 item.key 또는 item.id 를 사용한다. |
onEndReached |
- 목록의 끝에 도달했을 때 호출되는 콜백 함수 - 무한 스크롤 기능을 구현하는데 사용된다. |
horizontal |
가로 방향 스크롤 활성화 (기본값 : false ) |
numColumns |
열(Column)의 수 지정 (그리드 형식으로 데이터를 표시하기 위해 사용) |
반복할 요소의 키(Key) 설정 방법
- 다음과 같이 2가지 방법으로 키(Key)를 설정할 수 있다.
방법 1 : 데이터에 key
속성 추가하기
- 데이터가 객체(Object)일 경우,
key
속성을 포함시킨다.
// ... const courseGoal = [ { text: '1', key: Math.random().toString(), // key 값 추가 }, { text: '2', key: Math.random().toString(), // key 값 추가 }, { text: '3', key: Math.random().toString(), // key 값 추가 } ]; // ... <FlatList data={courseGoals} renderItem={(itemData) => { return ( <View> <Text>{itemData.item.text}</Text> </View> ); }} />
방법 2 : keyExtractor
속성 사용하기
- 데이터에서 고유한 키를 추출하는 방법을
FlatList
에 알려주는 방법이다. FlatList
의keyExtractor
속성을 사용하여 데이터에서 키로 설정할 값을 추출한다.
// ... const courseGoal = [ { text: '1', id: Math.random().toString(), }, { text: '2', id: Math.random().toString(), }, { text: '3', id: Math.random().toString(), } ]; // ... <FlatList data={courseGoals} renderItem={(itemData) => { return ( <View> <Text>{itemData.item.text}</Text> </View> ); }} keyExtractor={(item, index) => { return item.id; // 키값 추출 }} />
ScrollView 컴포넌트와의 차이점
렌더링 방식
특징 | FlatList | ScrollView |
렌더링 | 필요한 데이터만 렌더링 (가상화) | 모든 데이터를 한번에 렌더링 |
대량 데이터 처리 | 데이터 양이 많아도 성능이 좋음. | 데이터 양이 많으면 메모리 문제 발생 |
데이터 구조
특징 | FlatList | ScrollView |
데이터 관리 | 배열 형태의 data 프로퍼티 필요 |
자식 컴포넌트로 직접 추가 가능 |
동적 데이터 | data 변경 시 자동으로 리렌더링 |
데이터 변경 시 수동으로 추가/제거 필요 |
사용 목적
특징 | FlatList | ScrollView |
렌더링 | 대량의 동적 데이터 (리스트, 무한 스크롤) | 소량의 고정 데이터 (폼, 이미지 갤러리 등) |
대량 데이터 처리 | 세로/가로 리스트 또는 그리드 | 자유로운 레이아웃 |
최적화
특징 | FlatList | ScrollView |
성능 최적화 | 자동으로 가상화 처리 | 렌더링 최적화 기능 없음 |
추가 설정 | initialNumToRender , maxToRenderPerBatch 등으로 최적화 |
추가적인 최적화 옵션 없음 |
무한 스크롤
특징 | FlatList | ScrollView |
지원 여부 | onEndReached 를 통해 무한 스크롤 구현 가능 |
기본적으로 지원하지 않음 |
무한 스크롤 구현 | 간단하게 추가 가능 | 스크롤 이벤트를 수동으로 관리해야 함 |
사용 코드 비교
import { ScrollView, FlatList, View, Text } from 'react-native'; const courseGoals = [ { text: 'Learn React Native', id: Math.random().toString(), }, { text: 'Learn React.js', id: Math.random().toString(), }, ]
ScrollView
// (1) ScrollView <ScrollView> {courseGoals.map((goal, index) => ( <View key={goal.id}> <Text>{goal.text}</Text> </View> ))} </ScrollView>
FlatList
// (2) FlatList <FlatList data={courseGoals} renderItem={(itemData) => { return ( <View> <Text>{itemData.item.text}</Text> </View> ); }} keyExtractor={(item, index) => { return item.id; // 키값 추출 }} alwaysBounceVertical={false} />
사용 예제
import { FlatList, Text, View } from 'react-native'; const MyComponent = () => { const data = [ { id: '1', title: 'Item 1' }, { id: '2', title: 'Item 2' }, { id: '3', title: 'Item 3' }, ]; const renderItem = ({ item }) => ( <View> <Text>{item.title}</Text> </View> ); return ( <FlatList data={data} renderItem={renderItem} keyExtractor={item => item.id} /> ); }; export default MyComponent;
참고 사이트
FlatList · React Native
A performant interface for rendering basic, flat lists, supporting the most handy features:
reactnative.dev
ScrollView · React Native
Component that wraps platform ScrollView while providing integration with touch locking "responder" system.
reactnative.dev
728x90
728x90
'Programming > React Native' 카테고리의 다른 글
[React Native] 환경 변수 파일 사용하기 (react-native-dotenv) (0) | 2025.04.03 |
---|---|
[React Native] 카메라 권한 요청 메시지 표시 방법 (Expo) (0) | 2025.02.24 |
[React Native] 클립보드 기능 구현하기 (expo-clipboard) (0) | 2025.02.24 |
[React Native] blurOnSubmit 속성과 submitBehavior 속성 (0) | 2025.02.23 |
[React Native] TailwindCSS IntelliSense 활성화하기 (VS Code) (0) | 2025.02.19 |
[React Native] 클릭 시, 리플 효과(Ripple Effect) 주는 방법 (1) | 2024.12.11 |
[React Native] Expo Go 앱에서 Expo 프로젝트 연결 안되는 문제 해결 방법 (There was a problem running the requested app) (0) | 2024.11.26 |
[React Native] Expo CLI vs. React Native CLI (0) | 2024.11.25 |