프론트엔드/React

8. map()을 이용한 배열렌더링

2023. 4. 2. 23:37

map()을 보면, 처음 드는생각은

어?? 이거 자바스크립트 배열 내장메서드 아니야?

이걸로 리액트에서 뭘 어떻게할 수 있는데...

 

 

 

리액트에서 동적인 배열을 렌더링할 때,

map()을 이용하여 일반 데이터 배열을

리액트 엘리먼트로 이루어진 배열로 반환

 

 

실제로, 리액트에서 배열은 게시글, 리스트, 피드

등등을 표시하는 등에 자주 사용되기 때문에

무조건 알아둬야한다!!

 


 

아래의 예제를 보면서,

배열을 이용하여 리액트에서 List렌더링을 해보고,

개별적인 컴포넌트를 만들어보자!!

 

 

 

1. DiaryList.jsx

 

먼저, 일기리스트 컴포넌트를 작성할

DiaryList.jsx파일을 만들어준다.

 

 

 

2. App.js

 

그다음, dummyList를 만들어 DiaryList에

prop으로 데이터를 전달한 후,

그 데이터를 리스트 렌더링을 해보자!

 

 

 

3. DiaryEditor.jsx

 

아래는 useRef라는 Hook을 사용하여,

일기저장버튼을 클릭했을 때, 작성자와 일기가

정상적으로 입력이 되었는지 확인하고

입력이 되지않았다면 알람대신 focus로 알리는 것이다.

 

useRef 훅은 다시 한번 정리하여 포스팅할 예정이다 !!

 

 

 

 

4. DiaryList.jsx

 

DiaryList를 1번의 상태에서

map() 메서드를 이용하여 각각 리스트를

렌더링을 시켜보자!!

el은 diaryList 배열의 각각 객체 하나가 된다.

 

하지만, 이렇게만 해주고

콘솔창을 확인해보면, 아래와 같은 에러가

뜨는 것을 볼 수 있을 것이다.

 

 

위의 콘솔 에러는 

dummyList에 있는 3개의 리스트들 안에 있는

자식요소들 (id, author, content, emotion, createdAt)은

반드시 고유한 key라는 prop을 받아야하는데 없기 때문에

위와 같은 에러가 발생하는 것이다.

 

 

⭐️ 여기서 map()에서 key가 필요한 이유를 설명할 것이다.

 

방법은 이론상으로는 매우 간단하다!!

고유한 id로 각각 리스트별로 key값을 주면된다!!

 

👉🏻 먼저, key를 줘야하는 이유가 뭘까??

이유는 리액트가 어떤 항목을 변경, 추가 또는 삭제를 할때

어떤 아이템이 변경되었는지 빠르게 식별하는 것을 도와주기 때문이다.

 

따라서 key는 고유한값이어야만 한다.

 

그래서... 그걸 어떻게하는데..??

 

 

위처럼 고유한값인 id를 key로 주어,

리액트 렌더링할 때 각각 리스트를 식별하여

렌더링을 할 수 있게 도와주는 것이다.

 

 

🚨 그럼 만약에 id가 없으면 어떡하나요...??

 

배열에 id같은 고유한 값이 없을때가 있을 수 도있다.

그럴때는 map메서드의 콜백함수에 두번째 파라미터로

idx를 key로 사용하는 방법이 있긴하다.

 

그렇게 사용해도 일단 문제가 사라지긴하지만

진짜 최후의최후의 수단으로 써야한다.

이유는 idx를 key로 사용하면
데이터를 수정, 삭제, 추가 등등을 하면
idx의 순서가 바뀌어버려 리액트에서 문제가 생길 수 있기 때문이다.

 

 

📌 map() 메서드에서의 key를 정리해보면,

 

  • map에 key값이 없다면 중간에 값이 바뀌었을 때,
    그 하위값들이 전부 변하기 때문에
    key를 사용하여 key를 통해 추가, 삭제, 수정 등을 해야한다.
  • 고유 원소(ex: id)에 key가 있어야만 배열이 업데이트 될때
    효율적으로 렌더링이 된다.

  • 만약 고유의 값으로 안쓰고 배열안에 중복되는 key가 있으면
    렌더링시에 오류메세지가 콘솔에 나타나며,
    컴포넌트의 state가 엉망이되거나, 의도하지 않은 방식으로 바뀔 수 있다.

 


🖇️ 배열을 DiaryItem으로 분할하기

 

 

만약 위의 일기장 예제에서

일기아이템들을 삭제, 수정하는 기능을 넣고 싶으면

 

원래의 DiaryList 컴포넌트는 리스트를 렌더링하려고

만든 컴포넌트였다.

 

하지만 이 컴포넌트에 삭제, 수정하는 기능들을 넣으면

컴포넌트의 고유기능을 잃어 매우 안좋은 컴포넌트가 된다.

 

따라서, 렌더링해야하는 아이템(작성자, 내용, 감정, 시간)을

별도의 컴포넌트로 분할을 해주어야한다.

 

 

1. DiaryList.jsx

 

 

위처럼 key는 그대로 el.id로 고유한 id값을 주었고,

일기 하나하나의 객체에 포함된 모든 데이터들을

스프레드연산자를 통하여 전달해주었다.

 

el이라는 객체에 포함된 모든 데이터가

DiaryItem에게 prop으로 전달된다.

 

 

 

2. DiaryItem.jsx

 

 

DiaryList에서 prop으로 받아온 데이터들을

컴포넌트의 매개변수로 받아서,

{}를 통하여 데이터들을 각각 렌더링시켜주었다.

 

 

 

3. App.css

 

 

위처럼 간단하게 css를 주어 보기좋게 만들어주면

끝이다!!!

 

결과를 보면,

 

이렇게 실제로도 자주 사용되는 리액트에서

동적인 배열을 렌더링해야 할때 map() 메서드를 사용하여

일반 데이터 배열을 리액트 엘리먼트로 이루어진 배열로

변환해주어, 렌더링되게 해주는걸 알아보았다.

 

'프론트엔드/React' 카테고리의 다른 글
  • 10. state & event 문제 실습
  • 9. useReducer란??
  • 7. useEffect
  • 6. State 끌어올리기(Lifting State Up)
plla2
plla2
프론트엔드 개발자가 되고픈 개미의 일대기 🐜
plla2
코린이 "개미"의 개발블로그
plla2
전체
오늘
어제
  • 분류 전체보기 (112)
    • 프론트엔드 (40)
      • CSS (1)
      • JS (16)
      • React (17)
      • Redux (2)
      • TS (4)
      • Pre-project (0)
    • 프로젝트 회고, 리팩토링 (14)
      • 포트폴리오 프로젝트 (2)
      • moviepop 팀 프로젝트 (1)
      • lofi 프로젝트 (2)
      • 스택오버플로우 팀 프로젝트 (5)
      • commerce 프로젝트 (1)
    • 코테 (26)
      • koans, 코플릿, sprint (9)
      • 데일리 코딩 (17)
    • 백엔드 (5)
      • Node (4)
    • CS (6)
      • 알고리즘 (2)
      • 자료구조 (1)
      • 네트워크 (1)
    • 회고, 면접준비 (16)
      • Next.js Doc 번역 (7)
      • 면접 답변용 정리 (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 중첩구조분해
  • React
  • 프로토타입
  • 객체분해
  • 데일리코딩
  • Twittler
  • js
  • NodeList
  • 트리 자료구조
  • 프로토타입 체인
  • 데일리 코딩
  • 배열분해
  • State
  • 상태
  • 단어의 시작
  • 프론트엔드
  • 태그래핑
  • 블로킹 논블로킹
  • 클래스형
  • 배열렌더링
  • 렉시컬
  • 구조 분해 할당
  • dom
  • 비동기
  • HTMLCollection
  • 동기 비동기
  • 리액트 라우터
  • camelCase
  • 정규식
  • 페이지네이션

최근 댓글

최근 글

hELLO · Designed By 정상우.
plla2
8. map()을 이용한 배열렌더링
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.