React-Native

15. React-Native FlatList

Daesiker 2021. 2. 2. 09:25
반응형

FlatList 컴포넌트는 많은 양의 리스트 아이템을 보여주고 할 떄 쓰이는 React-Native 컴포넌트이다. Scroll View와 유사한 기능을 하나 동작 방식에 차이점이 있다.

<Scroll View>

는 데이터가 화면에 보이지 않을 때 사용자가 Swipe를 통해 안보이는 데이터를 볼 수 있도록 하기위한 컴포넌트이다. 다시 말해서 출력해야하는 데이터가 고정적이고 많지 않을 때 간단하게 사용할 수 있는 컴포넌트이다.

<FlatList>

는 모든 데이터를 한번에 렌더링하는 것이 아니라 보여지는 부분이나 혹은 수동으로 설정한 양 만큼의 데이터만 렌더링이 되고 화면에 데이터가 보여지지 않는 곳은 기다렸다가 사용자가 swipe를 할 때 swipe한 화면의 크기만큼 자동으로 리렌더링이 되어 보여지는 컴포넌트이다. 다시 말해서 데이터의 길이가 가변적이고, 데이터의 양을 예측할 수 없는 경우에 사용하기 적절하다.

—Example

import React from 'react';
import { SafeAreaView, View, FlatList, StyleSheet, Text, StatusBar } from 'react-native';

const DATA = [
  {
    id: '1',
    title: 'First Item',
  },
  {
    id: '2',
    title: 'Second Item',
  },
  {
    id: '3',
    title: 'Third Item',
  },
  {
    id: '4',
    title: 'Forth Item',
  },
  {
    id: '5',
    title: 'Fifth Item',
  },
  {
    id: '6',
    title: 'Sixth Item',
  },
  {
    id: '7',
    title: 'Seventh Item',
  },
  {
    id: '8',
    title: 'Eighth Item',
  },
  {
    id: '9',
    title: 'Ninth Item',
  },
  {
    id: '10',
    title: 'Tenth Item',
  },
];

const Item = ({ title }) => (
  <View style={styles.item}>
    <Text style={styles.title}>{title}</Text>
  </View>
);

const App = () => {
  const renderItem = ({ item }) => (
    <Item title={item.title} />
  );

  return (
    <SafeAreaView style={styles.container}>
      <FlatList
        data={DATA}
        renderItem={renderItem}
        keyExtractor={item => item.id}
      />
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    marginTop: StatusBar.currentHeight || 0,
  },
  item: {
    backgroundColor: '#f9c2ff',
    padding: 20,
    marginVertical: 8,
    marginHorizontal: 16,
  },
  title: {
    fontSize: 32,
  },
});

export default App;

→ data 딕셔너리가 FlatList를 통해 보여지는 예제

 

—Example2

import React, { useState } from 'react';
import { SafeAreaView, View, FlatList, StyleSheet, Text, StatusBar, TouchableOpacity } from 'react-native';

const DATA = [
  {
    id: '1',
    title: 'First Item',
  },
  {
    id: '2',
    title: 'Second Item',
  },
  {
    id: '3',
    title: 'Third Item',
  },
  {
    id: '4',
    title: 'Forth Item',
  },
  {
    id: '5',
    title: 'Fifth Item',
  },
  {
    id: '6',
    title: 'Sixth Item',
  },
  {
    id: '7',
    title: 'Seventh Item',
  },
  {
    id: '8',
    title: 'Eighth Item',
  },
  {
    id: '9',
    title: 'Ninth Item',
  },
  {
    id: '10',
    title: 'Tenth Item',
  },
];

const Item = ({ item, onPress, style }) => (
  <TouchableOpacity onPress={onPress} style={[styles.item, style]}>
    <Text style={styles.title}>{item.title}</Text>
  </TouchableOpacity>
);



const App = () => {
  const [selectedId, setSelectedId] = useState(null)

  const renderItem = ({ item }) => {
    //id가 selectedId라면 배경색상 변경
    const backgroundColor = item.id === selectedId ? "#6e3b6e" : "#f9c2ff";

    return (
      <Item
        item={item}
        //아이템을 클릭하면 selectedId가 변경
        onPress={() => setSelectedId(item.id)}
        style={{ backgroundColor }}
      />
    )
  };

  return (
    <SafeAreaView style={styles.container}>
      <FlatList
        //리스트의 소스를 담는 속성
        data={DATA}
        //data로 받은 소스의 아이템들을 render 시켜주는 콜백함수
        renderItem={renderItem}
        //item의 고유의 키를 부여하는 속성
        keyExtractor={item => item.id}
        //selectedId가 변경되면 리렌더링 되도록 하는 속성
        extraData = {selectedId}
      />
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    marginTop: StatusBar.currentHeight || 0,
  },
  item: {
    padding: 20,
    marginVertical: 8,
    marginHorizontal: 16,
  },
  title: {
    fontSize: 32,
  },
});

export default App;

→ FlatList의 요소를 클릭하면 배경색상이 변경되어 리렌더링되는 예제

 

—Required Props

  • data : FlatList의 소스를 담는 공간이다. (Array)
  • renderItem : data로 받은 소스의 item들을 통해 render 시켜주는 콜백함수이다.

 

—Props

  • horizontal(boolean) : 리스트를 가로로 보여지게 하는 속성(default : false)
  • keyExtractor(item, index) : item에 고유의 키를 주는 속성
  • extraData : 해당 데이터가 변경시에 FlatList가 리렌더링되는 속성
  • numColumns(number) : 리스트를 여러열로 표현할 때 사용
  • onEndReachedThreshold(number) : onEndReached를 호출할 시점(0.0 ~ 1)을 저장 (default: 1)
  • onEndReached (function): 해당 시점에 도달하면 function을 실행한다.

 

—Methods

  • scrollToEnd() : FlatList의 가장 끝부분으로 이동하는 함수
  • scrollToIndex() : FlatList의 원하는 index로 이동하는 함수
    srcollToIndex({animated: bollean, index: number}) 
    //index 파라미터 대신에 viewOffset(number), viewPosition(number)사용가능

    viewOffset(number) : 원하는 픽셀로 이동하는 함수

    viewPosition(0 ~ 1) : 최상단 = 0, 최하단 = 1 이고 지정한 위치로 이동

 

반응형