inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

만들면서 배우는 리액트 : 기초

11 컴포넌트 퀴즈 풀이

구조 분해 문법(Destructuring)질문

해결된 질문

282

Min ho

작성한 질문수 1

2

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

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

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

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

 

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

 

 

구조분해문법 javascript react

답변 1

1

진유림

넘 좋은 의문이네요 ㅎㅎ

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

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

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

0

Min ho

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값을 쓰고 싶으면 ( ) 안에 여러개를 선언하면 된다.

 

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

 

0

진유림

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

 

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

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

}

 

0

Min ho

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

API 적용 안되는 코드 수정 방법입니다.

0

78

1

고양이 이미지가 엑박이 뜨네요

0

60

1

npx 명령어 사용 불가

1

80

1

const 변수와 컴포넌트의 차이

0

92

1

강의노트

0

141

1

vite로 리액트 빌드한 후 깃허브에 배포하는 방법

0

332

1

빌드할때 dist 폴더가 만들어지는데요,

0

782

1

js파일 업로드 요청

0

137

1

변경된 api 사용시 text 안나오는 문제

0

146

1

메인글자수정...

1

273

3

디렉터리 구조 관련하여 참고할 만한 예시가 있을까요?

1

313

1

https://cataas.com/undefined 로 나오는데 왜그런건가요?

1

606

4

고양이 사진이 깨져요.ㅜㅜ

2

363

3

강의 노트 위치를 모르겠습니다

1

344

1

깃 강의노트 어디서 볼 수 있나요?

1

382

2

이해가 안되는 부분이 있어요

1

364

1

api가 안불러와지네요...

1

662

4

진유림 선생님 너무 궁금해서 질문드립니다 ㅜ

1

335

2

react에서 컴포넌트 만들 때 대문자를 쓰는 이유

2

1160

2

https://cataas.com/ 여기 도메인이 죽어서 이미지가 보이지 않습니다 ㅠ

1

333

2

index.js 내용이 바꼈네용

1

319

2

프로젝트에 사용할 상태와 로직 관리 라이브러리 훅 사용 질문입니다.

1

261

2

html 코드 오류

1

464

2

고양이 이미지 깨져요

1

342

2