본문 바로가기
Programming/React

[React] 컴포넌트 반복하기

by Bam_t 2021. 12. 7.
728x90

우선 반복을 하기전에 자바스크립트의 Array.map()함수에 대해 알고 넘어가야합니다. map()함수는 배열의 요소들을 인자로 가진 함수로 가공해서 배열의 형태로 반환하는 함수입니다. 이 함수를 꼭 기억해주세요.

const animals = ['야옹', '멍', '짹', '삐약'];
const repeat = animals.map(animal => animal.repeat(2));

console.log(repeat);


1. 배열을 컴포넌트 배열로 만들기

우선 간단하게 배열을 이용해서 컴포넌트 배열로 만들어서 반환하는 방법을 소개해드리겠습니다. 컴포넌트를 하나 만들어줍니다. 이때 map()함수는 animals배열의 요소들을 JSX형태로 변환해주는 역할을 합니다. 

import React from 'react';

const AnimalFriends = () => {
    const animals = ['야옹', '멍', '짹', '삐약'];
    const animalList = animals.map(animal => <li>{animal}</li>);

    return <ul>{animalList}</ul>;
}

export default AnimalFriends;

그런데 "key"가 없다면서 경고를 냅다 띄웁니다.

 

 

 

2. key

key라는 건 리액트에서 컴포넌트 배열에서 변화를 식별하기 위해 이용합니다. 물론 없어도 실행이 잘된거처럼 Virtual DOM과 실제 DOM을 비교했기 때문에 실행은 잘 되었습니다. 하지만 key를 이용해서 변화를 미리 감지한다면 더 빠른 동작을 보일 수 있겠죠. 그럼 이제 key가 뭔지 알았으니 key를 지정해보겠습니다.

key의 지정방법은 map에서 컴포넌트 값으로 전달해줍니다. 마치 컴포넌트에 props를 설정하는 것처럼요. key값의 특징은 언제나 고유 값을 가져야 한다는 것입니다. 그래서 대부분의 경우에 각 요소가 가지고 있는 id를 key로 지정해서 사용합니다.

//이 코드는 key에러가 여전히 납니다.
//이유는 후술
import React from 'react';

const AnimalFriends = () => {
    const animals = ['야옹', '멍', '짹', '삐약'];
    const animalList = animals.map(animal => <li key={animal.id}>{animal}</li>);

    return <ul>{animalList}</ul>;
}

export default AnimalFriends;

 

우리는 위에서 만든 예제로 id값을 주지 않았습니다. 그야 당연히 평범한 배열이니까요. id값을 주고 싶다면 위의 배열을 객체 배열로 만들면 됩니다.

const animals = [
  {id: 01, say: '야옹'},
  {id: 02, say: '멍'},
  {id: 03, say: '짹'},
  {id: 04, say: '삐약'},
];

 

또는 권장되는 방식은 아니지만 요소의 index를 key로 사용하는 방식도 있습니다.

import React from 'react';

const AnimalFriends = () => {
    const animals = ['야옹', '멍', '짹', '삐약'];
    const animalList = animals.map((animal, index) =>
      <li key={index}>{animal}</li>
    );

    return <ul>{animalList}</ul>;
}

export default AnimalFriends;

참조

https://ko.reactjs.org/docs/lists-and-keys.html

 

리스트와 Key – React

A JavaScript library for building user interfaces

ko.reactjs.org

728x90

'Programming > React' 카테고리의 다른 글

react-icons  (0) 2021.12.16
[React] 리액트 라우터  (0) 2021.12.11
[React] 조건부 렌더링  (0) 2021.12.06
[React] 컴포넌트에 CSS 적용하기  (0) 2021.11.18
[React] Hooks - useRef  (0) 2021.11.17

댓글