본문 바로가기
  • Let's study
Android/React-Native

[React-Native] FlatList

by 코딩고수이고파 2022. 10. 14.

모든 데이터를 한번에 불러와 리스트로 나타내는 ScrollView와 다르게 FlatList는 화면에 보이는 부분만 렌더링하는 차이가 있다. 

따라서 데이터에 변화가 있을 경우에는 FlatList를 사용하는 편이 좋다.

 

필요한 모듈

import {FlatList} from 'react-native';

 

데이터 배열 선언

리스트에 들어갈 데이터를 미리 선언해서 넣어보자. 

const Data = [
  {
    id: 1,
    title: 'One',
    des: 'Touch this',
  },
  {
    id: 2,
    title: 'Two',
    des: 'Touch this',
  },
  {
    id: 3,
    title: 'Three',
    des: 'Touch this',
  },
  {
    id: 4,
    title: 'Four',
    des: 'Touch this',
  },
  {
    id: 5,
    title: 'Five',
    des: 'Touch this',
  },
  {
    id: 6,
    title: 'Six',
    des: 'Touch this',
  },
  {
    id: 7,
    title: 'Seven',
    des: 'Touch this',
  },
];

 

리스트 컴포넌트 디자인

data 배열로부터 item을 가져와 리스트에 렌더링하기 위한 코드이다.

useState를 써서 컴포넌트를 클릭할 때 해당 컴포넌트의 색깔이 바뀌게 해보자.

style은 디자인을 조금 더 예쁘게 하기 위한 것이니 전체 코드에 가서 확인해볼 수 있다.

Hook은 꼭 App안에 들어가야 함을 잊지 말자!

const [selectedId, setSelectedId] = useState(null);

const renderItem = ({item}) => {
    const backgroundColor = selectedId === item.id ? '#CFFF8D' : '#DBDFFD';
    return (
      <TouchableOpacity onPress={() => setSelectedId(item.id)} style={[styles.item, backgroundColor]}>
        <Text style={styles.title}>{item.title}</Text>
        <Text style={styles.description}>{item.des}</Text>
      </TouchableOpacity>
    );
};

return문 안에 있는 코드는 리스트의 각 컴포넌트의 디자인이며 item은 데이터랑 연결했을 때 데이터 배열의 요소를 배정한다.

아래의 데이터를 배정한다고 했을 때 item.title 에는 'One' 이 들어간다.

{
    id: 1,
    title: 'One',
    des: 'Touch this',
}

 

화면에 보이기

이제 아래와 같이 <FlatList>를 사용해서 위에서 선언한 것들을 합쳐보자.

const App = () => {
  //const renderItem~~
  
  return (
    <SafeAreaView style={styles.container}>
      <FlatList
        data={Data}
        renderItem={renderItem}
        keyExtractor={item => item.id} //list의 키로 사용
      />
    </SafeAreaView>
  );
};

 

전체 코드

전체 코드는 아래와 같다.

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

const Data = [
  {
    id: 1,
    title: 'One',
    des: 'Touch this',
  },
  {
    id: 2,
    title: 'Two',
    des: 'Touch this',
  },
  {
    id: 3,
    title: 'Three',
    des: 'Touch this',
  },
  {
    id: 4,
    title: 'Four',
    des: 'Touch this',
  },
  {
    id: 5,
    title: 'Five',
    des: 'Touch this',
  },
  {
    id: 6,
    title: 'Six',
    des: 'Touch this',
  },
  {
    id: 7,
    title: 'Seven',
    des: 'Touch this',
  },
];

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

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

  const renderItem = ({item}) => {
    const backgroundColor = selectedId === item.id ? '#CFFF8D' : '#DBDFFD';
    return (
      <Item
        item={item}
        onPress={() => setSelectedId(item.id)}
        backgroundColor={{backgroundColor}}
      />
    );
  };

  return (
    <SafeAreaView style={styles.container}>
      <FlatList
        data={Data}
        renderItem={renderItem}
        keyExtractor={item => item.id} //list의 키로 사용
        extraData={selectedId} // selectedId가 변할 때 자동으로 렌더링
      />
    </SafeAreaView>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    marginTop: 10,
  },
  item: {
    padding: 20,
    marginVertical: 8,
    marginHorizontal: 16,
  },
  title: {
    fontSize: 24,
    fontWeight: '600',
  },
  description: {
    marginTop: 8,
    fontSize: 18,
    fontWeight: '400',
  },
});

export default App;

 

실행화면

 

 

'Android > React-Native' 카테고리의 다른 글

[React-Native] Stack Navigation  (0) 2022.10.20
[React-Native] Android / iOS에서 Icon 사용하는 법  (0) 2022.10.18
[React-Native] Bottom Navigation  (0) 2022.10.17
[React-Native] SectionList  (2) 2022.10.15
[React-Native] mac 세팅  (0) 2022.10.13

댓글