React 기본 학습 -5. 반복문

React 기본 학습 -5. 반복문

리액트 강좌를 보면서 학습한 내용 정리용.

리액트 무료 강좌(웹게임) - ZeroCho TV

반복문

1. 반복문 (map)

예제 1

<ul>
    {['1','2','3','4'].map((v) => {
        return (
        <li>{v}</li>
        );
    })}
</ul>

예제 1 결과

1
2
3
4

예제 2

<ul>
    {[['사과', '빨강'],['바나나', '노랑'],['포도', '보라'],['', '오렌지']].map((v) => {
        return (
        <li>{v[0]} - {v[1]}</li>
        );
    })}
</ul>

예제 2 결과

사과 - 빨강
바나나 - 노랑
포도 - 보라
귤 - 오렌지

2. 반복문 (key)

리액트가 vue.js에 비해 반복문이 좀 깔끔하지 않다는듯.

예제 1

<ul>
    {[{fruit: '사과', color: '빨강'},{fruit: '바나나', color: '노랑'},{fruit: '포도', color: '보라'},{fruit: '', color: '오렌지'}
    ].map((v, i) => {
        return (
        <li key={v.fruit + v.color}>{i} : {v.fruit} - {v.color}</li>
        );
    })}
</ul>

예제 1 결과

0 : 사과 - 빨강
1 : 바나나 - 노랑
2 : 포도 - 보라
3 : 귤 - 오렌지
주의

자주하는 실수

map((v, i) 에서 i가 index로 고유한 값이라고 생각해서 key 값에 <li key={i}>{i} : {v.fruit} - {v.color}</li> 이렇게 key={i} 하는 경우가 많은데 차후에 성능 최적화 할때 문제가 많이 생기니까 하면 안된다. i 자체를 key에 안쓰는것이 좋다.

리액트 개발시에는 이 key 정하는게 쓸데없이 귀찮다.

단 요소가 추가만 되는 배열인 경우는 i를 써도 되긴 한다는듯. 하지만 추가삭제 변동이 생길 수 있는 반복문의 경우는 i 사용시에 피 보는 경우가 많은 모양.

예제 1 소스 개선 방법-1-1. return 생략-중괄호 있음

화살표 함수(=>) 는 return 생략 가능함. 화살표 함수에서 중괄호가 없는건 return 의 의미하기 때문에 예제 1의 소스를 아래와 같이 return 없이 소괄호”()” 또는 괄호 없이 선언 가능.

<ul>
    {[{fruit: '사과', color: '빨강'},{fruit: '바나나', color: '노랑'},{fruit: '포도', color: '보라'},{fruit: '', color: '오렌지'}
    ].map((v, i) => (
        <li key={v.fruit + v.color}>{i} : {v.fruit} - {v.color}</li>
    ))}
</ul>

예제 1 소스 개선 방법-1-2. return 생략-중괄호 없음

<ul>
    {[{fruit: '사과', color: '빨강'},{fruit: '바나나', color: '노랑'},{fruit: '포도', color: '보라'},{fruit: '', color: '오렌지'}
    ].map((v, i) => 
        <li key={v.fruit + v.color}>{i} : {v.fruit} - {v.color}</li>
    )}
</ul>

예제 1 소스 개선방법-2. 코드 리팩토링

NumberBaseball.jsx (리팩토링 전)

import React, { Component } from 'react'; // 이렇게 합쳐서 쓸 수 있다.

class NumberBaseball extends Component {

    render(){
        return(
            <>
              <ul>
                  {[['사과', '빨강'],['바나나', '노랑'],['포도', '보라'],['', '오렌지']].map((v) => {
                      return (
                      <li>{v[0]} - {v[1]}</li>
                      );
                  })}
              </ul>
            </>
        );
    }
}

NumberBaseball.jsx (리팩토링 후)

import React, { Component } from 'React'; // 이렇게 합쳐서 쓸 수 있다.

class NumberBaseball extends Component {

    fruits = [
        {fruit: '사과', color: '빨강'},
        {fruit: '바나나', color: '노랑'},
        {fruit: '포도', color: '보라'},
        {fruit: '', color: '오렌지'}
    ];
    
    render(){
        return(
            <>
              <ul>
                  {this.fruits.map((v, i) => 
                  <li key={v.fruit + v.color}>{i} : {v.fruit} - {v.color}</li>
                  )}
              </ul>
            </>
        );
    }
}

Pie's Tech Note

생계형 개발자의 메모장

comments powered by Disqus

    rss facebook twitter github youtube mail spotify instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora