개발자꿈나무

08. 반복문 쓰기 본문

React

08. 반복문 쓰기

망재이 2024. 9. 12. 22:07

본론

map 함수 사용법

 

코드를 짜다보면 똑같이 반복되는 부분들이 많이 생길 수 있는데 중복되는 부분들은 하나로 합쳐서 사용하게 되면 훨씬 코드 양도 줄어들고 깔끔하게 코드를 짤 수 있다. 보통 for를 이용해서 반복문을 짜는데 JSX 중괄호 안에서는 for를 사용할 수 없어서 map()을 사용해야 한다.

 

모든 array 자료 우측에는 map 함수를 붙일 수 있다.

1. array에 들어있는 자료 갯수만큼 코드를 반복실해준다.

let array = [1,2,3]
array.map(function(){
	console.log(1)
});

//1이 3번 찍힘

 

2. 콜백함수에 파라미터를 아무거나 넣게되면 array 안에 있던 모든 자료를 하나씩 출력해준다.

let array = [1,2,3]
array.map(function(a){
	console.log(a)
});

//1, 2, 3이 찍힘

 

3. return 선언을 하게 되면 array에 값을 담아서 반환해준다.

let array = [1,2,3]
let newArray = array.map(function(a){
	return a * 10
});
console.log(newArray)
//10, 20, 30 찍힘

 

 

JSX 내에서 html 반복생성하기

 

위 map을 사용해서 간단하게 생성할 수 있다. 

function App() {
  return ({
    <div>
      {
        [1,2,3].map(function(){
          return <div>Hello</div>
        })
      }
    </div>
  })
}

 

위 코드를 실행해주면 [<div>Hello</div>,<div>Hello</div>,<div>Hello</div>]가 남는다. 따라서 map을 사용해서 html 반복생성이 가능하다.

 

블로그 글 목록을 반복문으로 축약하는 것 역시 똑같은 절차를 따르면 된다.

function App() {
	return (
      {
        title.map(function() {
          return (
            <div className="list">
            <h4>{title[0]}</h4>
            <p>2월 17일 발행</p>
          </div>
          )
        })
      }
  )}

 

이렇게 map함수를 이용하면 글목록이 3개 생성된 모습을 확인할 수 있는데 현재 글제목을 title[0]라고 명시해놔서 모든 글제목이 똑같이 보인다. 이를 title 배열의 값 하나하나를 가져와 띄우고 싶다면 두 가지 방법을 사용할 수 있다.

function App() {
	return (
      {
        title.map(function(a) {
          return (
            <div className="list">
            <h4>{a}</h4>
            <p>2월 17일 발행</p>
          </div>
          )
        })
      }
  )}
function App() {
	return (
      {
        title.map(function(a, i) {
          return (
            <div className="list">
            <h4>{title[i]}</h4>
            <p>2월 17일 발행</p>
          </div>
          )
        })
      }
  )}

 

위 코드는 파라미터에 아무 값이나 작명을 해주면 배열 안의 값들을 하나하나 불러온다는 특성을 이용한 방법이고 두 번째 코드는 파라미터를 2개까지 작명할 수 있는데 첫번째 a는 배열 안에 있던 자료, 두번째 i는 0부터 1씩 증가하는 정수가 된다. 따라서 title[i]라는 것은 title[0], title[1], title[2]를 의미하는 것이다.

 

** 참고

map 반복문으로 반복생성한 html에는 key={} 이런 속상을 추가하여 key 값을 넣어줘야 한다. 그래야 리액트가 div들을 각각 구분할 수 있고, 없으면 warning을 띄워준다.

<div className="list" key={i}>

 

 

더보기

** 실습

글제목 옆에 좋아요를 누르는 곳까지 함께 반복문으로 묶여서 표시가 되고 있는데 문제는 버튼을 눌렀을 때 모든 좋아요 갯수가 같이 올라간다는 점이다. 개별적으로 좋아요를 증가하게 해야한다.

 

이 부분은 앞서 배운 array 변경 방법을 참고해서 코드를 짜봤다. 

      {/* 코드 반복문 */}
      {
        title.map(function(a, i) {
          return (
            <div className="list">
            <h4>{title[i]} 
            <span onClick={()=>{
              let copy = [...like];
              copy[i] = copy[i] + 1;
              updateLike(copy)
              }}>♥️</span> {like[i]}</h4>
            <p>2월 17일 발행</p>
          </div>
          )
        })
      }

 

앞서 배운 spread 문법을 이용해 copy 본 배열을 하나 생성해두고 반복문이 돌 때 마다 i번째 값에서 1을 더하도록 설정했다. 다음 state 변경함수를 이용해서 새로 생성한 배열을 state에 넣어두면 개별적으로 좋아요 갯수가 상승할 수 있다.

728x90

'React' 카테고리의 다른 글

10. Input 기능 다루기  (4) 2024.09.19
09. props 기본개념  (2) 2024.09.14
07. 동적 모달창 만들기  (1) 2024.09.11
06. Component 기본문법  (0) 2024.09.09
05. array/object 변경  (0) 2024.09.09