• 카테고리

    질문 & 답변
  • 세부 분야

    프론트엔드

  • 해결 여부

    해결됨

구조 분해 문법(Destructuring)질문

22.03.09 00:29 작성 조회수 160

2

1:21 에서 말씀해주신 구조분해문법(Destructuring)에 질문이 있습니다.

알려주신 주소에 나와있는 자료를 보면 다음과 같습니다.

이 코드에서 var { language, position, area, hobby, age} = josh; 와 같은 코드가 있어야 디스트럭처링 문법이 실행하는 것을 개발자 도구를 통해 확인했습니다.

그런데 const MainCard의 변수로 넣은 {img}는 저희가 var {img} = props와 같이 선언한 적이 없는데 잘 작동하고 있습니다.

 

이것이 가능한 이유가 무엇인지 알고 싶습니다.

 

 

답변 1

답변을 작성해보세요.

1

넘 좋은 의문이네요 ㅎㅎ

const MainCard 등으로 만든 리액트 컴포넌트는 

자동으로 함수 첫번째 인자로 props가 넘어오기 때문이에요.

console.log(props) 찍어보시면 바로 느낌 오실거예요 ㅎㅎ

Min ho님의 프로필

Min ho

질문자

2022.03.09

console.log(props)를 찍은 결과

{img: 주소} 가 나오는 것을 확인했고 선생님의 말씀을 이해했습니다. 그리고 제 나름대로 좀 더 알아보았습니다.

두번째 인자를 이처럼 넘길 수 없을까 싶은 생각에 다음과 같이 진행해보았습니다.

const app = (
        <div>
          <Title> 1번째 고양이 가라사사대 </Title>
          <Form />
          <MainCard
            img="https://cataas.com/cat/60b73094e04e18001194a309/says/react"
            alt="이건 고양이 사진입니다."
          />
          <Favorites />
        </div>
      );

기존에는 인자 하나만 있어 {img}가 가능했지만 alt를 추가해보았습니다.

이때 console.log(props)를 했을 때 {img: 주소, alt: "이건 고양이입니다"}가 나왔습니다.

그리고 나서 const MainCard에 {img} 대신 {alt}를 넣고 다시 실행해보았습니다.

그 결과 잘 나오는 것을 확인할 수 있었습니다. 혹시나 싶어 이번에는 props에 width 값 400도 추가하여 해보았습니다. 그러면 이제 props에는 img, alt, width의 값을 갖고 있게 됩니다.

이 상태에서 MainCard의 변수로 {width}를 준 결과 잘 실행되는 것을 확인했습니다.

이를 통해서 리액트 컴포넌트에서 디스트럭처링 문법을 사용할 수 있으며 var를 선언하는 곳이 const MainCard = ( ) => {} 에서 괄호임을 알 수 있었습니다.

여기서 한 발 더 생각해보았습니다. img 하나만 쓰려는 것이 아니라 alt, width도 같이 쓰고 싶다면 괄호 안에서 다른 것들도 같이 선언하면 어떨까? 하고 말이죠

props가 {img : 주소 , alt: "고양이",  width: 400}를 가지고 있을 때 MainCard를 이렇게 작성해보았습니다.

const MainCard = ({ img, alt, width }) => {
        function handleHeartClick() {
          console.log("하트 눌렀음");
        }
        function handleHeartMouseOver() {
          console.log("하트 스쳐 지나감");
        }
        return (
          <div className="main-card">
            <img src={img} alt={alt} width={width} />
            <button
              onClick={handleHeartClick}
              onMouseOver={handleHeartMouseOver}
            >
              🤍
            </button>
          </div>
        );
      };

그 결과 다음과 같습니다.

문제없이 잘 나오는 것을 확인할 수 있었습니다.

 

그럼 정리해보겠습니다.

1. 구조 분해 문법(Destructuring)에서 var선언은 리액트 컴포넌트에서 ( ) 가 담당한다.

2. props의 여러 key값을 쓰고 싶으면 ( ) 안에 여러개를 선언하면 된다.

 

선생님 덕분에 이것저것 해보면서 많이 배웠습니다, 감사합니다.
혹시 저와 같이 궁금한 분이 있을까 이렇게 정리해서 글을 남겨두겠습니다. 

 

여러 실험 해보신거 멋져요~ㅎㅎ

 

다 맞는데 정리를 살짝 수정할게요

1. 리액트 컴포넌트는 함수로 만들 수 있다.

function ComponentA(props) {
  return <div>hi</div>

}

const ComponentB = (props) => {
  return <div>hi</div>

}

2. JSX 문법을 사용해서 여러 인자를 넘기면 이들은 리액트 컴포넌트 함수의 첫 번째 인자로 내려온다

<ComponentA a={1} b="hi" />

function ComponentA(props) {
  console.log(props) // {a: 1, b: "hi"}

}

3. 이 첫번째 인자는 ES6의 구조분해문법을 사용해서 바로 꺼내올 수 있다.

function ComponentA({a, b}) {
  console.log(a, b) // a, hi

}

 

Min ho님의 프로필

Min ho

질문자

2022.03.21

사정이 있어서 답변이 늦었습니다. 선생님의 깔끔한 정리 덕분에 저도 이 문제에 대해서 잘 이해한 것 같습니다! 특히 두 번째 부분이 제게 많은 도움이 되었습니다. 감사합니다!