Hyebin‘s blog
article thumbnail
Published 2021. 12. 6. 16:55
[React] 코딩애플 blog -4 Front-end/React

map() 함수

 

반복문이란? 어떤 코드를 반복하고 싶을 때 사용!

 

리액트는 html도 반복문으로 반복시킬 수 있음! 하지만 JSX 중괄호 내에 for은 넣지 못한다.

그럼 어떻게 할까❓

map이라는 함수 활용하자!

 

*map함수란?

array 내의 모든 데이터에 똑같은 작업을 시켜주고 싶을때 .map( ) 사용

 

만약 array 내에 모두 2를 곱해주고 싶다면❓

var array = [2,3,4];

var newArray = array.map(function(a){
	return a * 2
});

array안에 있는 하나하나의 값들이 꺼내져서 2가 곱해진다.

a라는 파라미터는 array안에 하나하나의 데이터를 의미!

newArray = [4,6,8] 이 된다!

 

{
	반복할데이터.map(()=>{
		return <HTML>
	})
}

또는

{
	반복할데이터.map(function(){
		return <HTML>
	})
}
let [글제목, 글제목변경] = useState([
    "난곡 돈까스 맛집! 오츠카도",
    "신대방 온정 돈가스 너무 매워",
    "강남 토끼정, 맛집이다 ",
  ]);
{
글제목.map(() => {
        return <div>안녕</div>;
      })
}

 

안녕이 글제목 갯수에 맞게 세번 출력이 되었다!

{글제목.map((글) => {
        return (
          <div className="list">
            <h3>{글}</h3>
            <p>2월 17일 발행</p>
            <hr />
          </div>
        );
      })}

array안에 있는 데이터들이 잘 출력이 된 것을 확인할 수 있다!

map함수로 짧게 html 코드를 짤 수 있게 되었다!

 

만약 map()함수 말고 그냥 for문을 쓰고 싶을땐❓

보통 함수안에서 사용한다.

function 반복된UI(){
  var 어레이 = [];
  for(var i=0;i<3;i++){
    어레이.push(<div>안녕</div>)
  }
  return 어레이
}
{
반복된UI()
}

Props

이때, 그냥 모달 컴포넌트에 {글제목[0]} 이렇게 쓰면 에러가 난다. 정의 되지 않다고 에러가뜸

이유는 글제목은 function app 안에 있고,

내가 사용하고 싶은 글제목을 function modal 에 넣고싶다!

위 그림과 같이 Modal은 자식 컴포넌트가 된다.

따라서 부모 컴포넌트는 자식 컴포넌트한테 글제목이라는 데이터를 전송해 줘야 한다.

props문법을 사용해서 전송해줘야 state 사용 가능!

 

전송 방법

<자식컴포넌트 작명={state명}/> //이런식으로

{modal == true ? <Modal **글제목={글제목}** /> : modal == null}
  1. 자식 컴포넌트에서 pros 파라미터 입력 후 사용
function Modal(**props**) {
  return (
    <div className="modal">
      <h2>{**props.글제목[0]**}</h2>
      <p>날짜</p>
      <p>상세내용</p>
    </div>
  );
}

 

 

예제 ) 제목을 누를 때 각각 다른 모달창이 뜨게 만들어보자!

hint? 내가 누른 제목에 번호를 state로 저장한다.

state에 따라서 ui가 변경되도록 만들다.

  • UI만드는 법칙?
    • UI와 관련된 중요 정보들을 state로 저장!
    • satate에 따라서 UI가 수정되게 만든다!

0번째 버튼을 누르면 누른제목 state가 0

1번째 버튼을 누르면 누른제목 state가 1

2번째 버튼을 누르면 누른제목 state가 2

<button
onClick={() => {
누른제목변경(0);
}}
>
버튼1
</button>
<button
onClick={() => {
누른제목변경(1);
}}
>
버튼2{" "}
</button>
<button
onClick={() => {
누른제목변경(2);
}}
>
버튼3
</button>
function Modal(props) {
  return (
    <div className="modal">
      <h2>{props.글제목[props.누른제목]}</h2>
      <p>날짜</p>
      <p>상세내용</p>
    </div>
  );
}

이 결과 버튼이 누르면 모달창 제목이 바뀌게됨!

그렇다면 버튼 말고 글 제목을 누르면 모달창 제목이 바뀌게 할 수 없을까❓

 

위에 클릭시 누른제목변경함수는 그대로 이용하면 된다.

대신 map함수에서 두번째 파라미터를 입력하면 이것은 맵 반복문이 돌때마다 1씩 증가하는 변수이다

{글제목.map((글, **i**) => {
        return (
          <div className="list">
            <h3
              onClick={() => {
                누른제목변경(i);
              }}
            >
              {글}
            </h3>
            <span
              onClick={() => {
                따봉변경(좋아요 + 1);
              }}
            >
              👍
            </span>
            {좋아요}
            <p>2월 17일 발행</p>
            <hr />
          </div>
        );
      })}

예제 ) 따봉👍 버튼 함수를 맵함수에 넣어도 될까?

답: 된다!

근데 문제발생

따봉을 누르면 모든 따봉이 같이 올라가게 된다. 이유는 똑같은 값을 다 공유하고 있기 때문

이 문제에 대한 해결 핵심은 글이 세개니까 따봉갯수도 세개가 필요하다.

내가 짠 코드 → 근데 오류 발생?😥

let [좋아요, 따봉변경] = useState([0, 0, 0]);

{글제목.map((글, i) => {
        return (
          <div className="list">
            <h3
              onClick={() => {
                누른제목변경(i);
              }}
            >
              {글}
            </h3>
            <span
              onClick={() => {
                따봉변경(좋아요[i] + 1);
              }}
            >
              👍
            </span>
            {좋아요[i]}
            <p>2월 17일 발행</p>
            <hr />
          </div>
        );
      })}

내가 생각한 알고리즘은 첫번째 따봉버튼을 누르면 좋아요[0]+1, 두번째 따봉버튼을 누르면 좋아요[1]+1, 세번째 따봉버튼을 누르면 좋아요[2]+1 이렇게 증가되고, 좋아요[i]을 보여주는 상황을 상상했다.

그런데 이런,, 오류 발생!

클릭하면 숫자가 사라진다.

 

😥😓😭 뭐가 잘못된거지

'Front-end > React' 카테고리의 다른 글

[React] 코딩애플 blog -6  (0) 2021.12.09
[React] 코딩애플 blog -5  (0) 2021.12.09
[React] 코딩애플 blog -3  (0) 2021.12.05
[React] Virtual DOM  (0) 2021.12.05
[React] 코딩애플 blog -2  (0) 2021.12.05
profile

Hyebin‘s blog

@hyebin Lee

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그