React, Next

[RN] React Native 스크롤 설정하기 (ScrollView와 FlatList)

지은이: 김지은 2023. 12. 8. 15:59
728x90

 

ScrollView

컨테이너의 사용 가능한 공간을 넘어가면 스크롤 할 수 있어야하는데

웹에서는 공간을 넘어가면 기본으로 스크롤바가 나타나서 스크롤이 되지만, 모바일 앱은 그렇지 않다.

 

스크롤할 수 있게 만들려면 <ScrollView> 컴포넌트를 사용하면 된다.

import { ScrollView } from "react-native";

export default function HomeScreen() {
    return (
          <ScrollView></ScrollView>
    )
}

 

만약 원래 있던 View 대신 ScrollView를 사용한다면 스크롤은 되겠지만, 원래 있던 공간배치, 레이아웃이 달라지게 된다.

스크롤 가능한 영역은 부모 요소의 크기에 따라 결정되기 때문에 위에 View로 한 번 더 감싸줘서 부모의 높이를 설정하는 style을 적용하던가, 직접 ScrollView의 높이를 설정하는 방법. 예를 들어 style로 flex: 1을 준다면 ScrollView가 모든 사용 가능한 공간을 차지하기 때문에 그 안에서 스크롤이 가능한 영역을 형성할 수 있다.

 

ScrollView엔 다양한 props 옵션을 제공하는데

<ScrollView horizontal>{/* 수평 스크롤 */}</ScrollView>
<ScrollView showsVerticalScrollIndicator={false}>{/* 스크롤바 감추기 */}</ScrollView>
<ScrollView contentContainerStyle={{ padding: 20 }}>{/* 내용에 패딩 추가 */}</ScrollView>

 

외에도 정말 많으니 자세한 건 문서를 꼭 읽어보길 추천!

https://reactnative.dev/docs/scrollview

 

이렇게 콘텐츠에 스크롤을 추가할 땐 유용하지만 ScrollView의 단점이 있는데

ScrollView는 전체 UI가 렌더링 될 때마다 안에 있는 자식 항목을 전부 렌더링하기 때문에 현재 화면에서 보이지 않더라도

화면 뒤에선 계속 렌더링이 되고 있어 성능에 문제가 생길 수 있다.

그래서 끝이 정해진 콘텐츠 외에 무한 스크롤같은 동적 목록에는 ScrollView를 사용하지 않는다.

 

FlatList

위 같은 성능 저하를 피하고 싶으면 React Native에서 제공하는 <FlatList> 컴포넌트를 사용하면 된다.

FlatList는 스크롤 가능한 목록에 적용할 수 있는데 스크린에서 보이는 항목만 렌더링하고, 화면 밖의 항목 스크린에서 멀리 스크롤 되면 항목을 제거해서 메모리와 처리시간을 절약할 수 있다.

import { FlatList, Text, View } from 'react-native';

export default function HomeScreen() {
  const data = [
    { key: 'item1', title: 'Item 1', id: ..},
    { key: 'item2', title: 'Item 2', id: ..},
    ...
  ];

  return (
    <FlatList
      data={data}
      renderItem={({ item }) => (
        <View>
          <Text>{item.title}</Text>
        </View>
      )}
      keyExtractor={(item) => item.id}
    />
  );
}

 

FlatList는 필수 prop이 두가지 있는데,

출력할 배열 데이터인 data와 각 데이터 항목을 렌더링 하는 함수인 renderItem을 지정해줘야한다.

 

이렇게만 설정하면 키가 누락됐다는 경고문이 뜨는데 FlatList에서 키를 추가하는 방법은 두가지가 있다.

첫번째는 위 코드 처럼 직접 data 객체에 key를 속성을 추가해서 고유 키로 설정하는 방법.

그렇게 하면 FlatList가 자동으로 key속성을 찾기 때문에 경고문이 뜨지 않는다.

두번째 데이터 객체에 직접 key 속성을 추가할 수 없는 경우 keyExtractor prop을 사용해서 각 항목에서 id같은 고유한 키를 추출하는 함수를 지정하면 된다.