본문 바로가기

Today`s Study

22.03.09 수

오늘은 리액트에 대해서 공부를 진행했습니다.

그리고 그 중에서 구조분해문법(Destructuring)에 대해 좀 더 자세히 파보았습니다.

저는 이것을 참고해서 리액트 컴포넌트를 구조분해문법으로 작성해보았습니다.

 

기존에는 props를 활용해 이렇게 작성했었습니다.

const MainCard = (props) => {
      function handleHeartClick() {
        console.log("하트 눌렀음");
      }
      function handleHeartMouseOver() {
        console.log("하트 스쳐 지나감");
      }
      return (
        <div className="main-card">
          <img src={props.img} alt="고양이" width="400" />
          <button
            onClick={handleHeartClick}
            onMouseOver={handleHeartMouseOver}
          >
            🤍
          </button>
        </div>
      );
    };
    
    const app = (
        <div>
          <Title> 1번째 고양이 가라사사대 </Title>
          <Form />
          <MainCard
            img="https://cataas.com/cat/60b73094e04e18001194a309/says/react"
          />
          <Favorites />
        </div>
      );

 

이제 구조분해문법으로 작성해보겠습니다.

const MainCard = ({ img }) => {
        function handleHeartClick() {
          console.log("하트 눌렀음");
        }
        function handleHeartMouseOver() {
          console.log("하트 스쳐 지나감");
        }
        return (
          <div className="main-card">
            <img src={img} alt="고양이" width="400"} />
            <button
              onClick={handleHeartClick}
              onMouseOver={handleHeartMouseOver}
            >
              🤍
            </button>
          </div>
        );
      };
      
const app = (
        <div>
          <Title> 1번째 고양이 가라사사대 </Title>
          <Form />
          <MainCard
            img="https://cataas.com/cat/60b73094e04e18001194a309/says/react"
            alt="고양이"
            width="400"
          />
          <Favorites />
        </div>
      );

 

이 과정에서 맨 처음 참고한 코드를 보면 var { language, position, area, hobby, age} = josh;와 같은 코드가 있어서 구조분해문법이 실행하는 것을 확인할 수 있습니다.

그런데 구조분해문법을 활용한 코드에는 var처럼 선언한 적이 없습니다.

 

이를 의아해서 선생님께 물어본 결과 이런 답장을 주셨습니다.

[const MainCard 등으로 만든 리액트 컴포넌트는 자동으로 함수 첫번째 인자로 props가 넘어오기 때문입니다.]

 

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

 

이런 결론을 내릴 수 있었습니다.

 

이번 공부는 정말로 뿌듯한 공부였던 것 같습니다. 제 호기심에서 시작하여 끝을 낼 수 있었기 때문인 것 같습니다.

이게 공부에서 찾을 수 있는 즐거움이 아닐까 싶네요 ㅎㅎ

앞으로도 이렇게 공부할 수 있도록 노력해보겠습니다.

728x90

'Today`s Study' 카테고리의 다른 글

22.03.11 금  (0) 2022.03.11
22.03.10 목  (0) 2022.03.10
22.03.08 화  (0) 2022.03.09
22.03.04 금  (0) 2022.03.04
22.03.03 목  (0) 2022.03.03