[React] Component

코병아리·2022년 2월 23일
0

React

목록 보기
4/5
post-custom-banner

컴포넌트란?(component)

개념적으로 컴포넌트는 JavaScript 함수와 유사합니다. “props”라고 하는 임의의 입력을 받은 후, 화면에 어떻게 표시되는지를 기술하는 React 엘리먼트를 반환합니다.

React 문서

컴포넌트의 종류

  1. 클래스형 컴포넌트

    class Welcome extends React.Component {
     render() {   // Class형 컴포넌트에서는 render 함수가 꼭 있어야 하며, 그 안에서 보여 주어야 할 JSX를 반환해야 합니다.
       return <h1>Hello, {this.props.name}</h1>; // JSX 반환
     }
  2. 함수형 컴포넌트

    function Welcome(props) {
     return <h1>Hello, {props.name}</h1>;
    }

    React의 관점에서 봤을 때 위 예시의 컴포넌트는 동일합니다. 함수 컴포넌트는 클래스형 컴포넌트보다 선언하기가 편하고 메모리 자원도 덜 사용하며 빌드한 후 배포할 때도 파일 크기가 더 작다는 장점이 있으나 state와 라이프 사이클 API 사용이 불가능하다는 단점이 있습니다. (이 단점은 Hooks라는 기능이 도입되면서 해결되었습니다.)
    리액트 공식 메뉴얼에서는 컴포넌트를 새로 작성할 때 함수 컴포넌트와 Hooks를 사용하는 걸 권장하고 있습니다.

    props

    Props는 properties를 줄인 표현으로 컴포넌트 속성을 설정할 때 사용하는 요소입니다. React가 사용자 정의 컴포넌트로 작성한 엘리먼트를 발견하면 JSX 어트리뷰트와 자식을 해당 컴포넌트에 단일 객체로 전달합니다. 이 객체를 “props”라고 합니다.

    JSX 내부에서 props 렌더링

    Mycomponent 컴포넌트에서 name 이라는 props를 렌더링 하도록 설정하는 예시입니다. props 값은 컴포넌트 함수의 파라미터로 받아 와서 사용할 수 있습니다. props를 렌더링할 때는 JSX 내부에서 { } 기호로 감싸주면 됩니다.

    // MyComponent.js (자손컴포넌트)
    const MyConponent = (props) => {
     return <div>안녕하세요, 제 이름은 {props.name}입니다. </div>;
     // return <요소>문자열{props.속성명} </요소> 
    };
    
    export default MyConponent;

    컴포넌트를 사용할때 props 값 지정하기

    App 컴포넌트에서 Mycomponent의 props값을 지정합니다.

    // App.js (부모컴포넌트)
    import Mycomponent from "./MyComponent";
    // import 자손컴포넌트명 from 자손컴포넌트경로
    const App = () => {
     return <Mycomponent name="hrimrim" />; // return <자손컴포넌트명 속성명 = "값" />
    };
    
    export default App;

    실행 결과

    props 기본값 설정하기

    App.js 파일에서 name="hrimrim" 값을 지우고 return <MyComponent />; 로 코드를 바꾸면 name 값을 지정하지 않았기 때문에 안녕하세요, 제 이름은 입니다 라는 내용이 보일 것입니다. defaultProps를 사용해서 기본값을 설정해 줄 수 있습니다.

    //MyComponent.js
    const MyConponent = (props) => {
     return <div>안녕하세요, 제 이름은 {props.name} 입니다. </div>;
    };
    
    MyConponent.defaultProps = {
     name: " 기본 이름 "
    };
    
    export default MyConponent;

    태그 사이의 내용을 보여 주는 children

    리액트 컴포넌트를 사용할 때 컴포넌트 태그 사이의 내용을 보여주는 props 입니다.

    // App.js 수정
    import Mycomponent from "./MyComponent";
    
    const App = () => {
     return <Mycomponent>짬뽕먹고싶다</Mycomponent>;
    };
    
    export default App;
    const MyConponent = (props) => {
     return (
       <div>
         안녕하세요, 제 이름은 {props.name} 입니다. children 값은 {props.children}
       </div>
     );
    };
    
    MyConponent.defaultProps = {
     name: " 기본 이름 "
    };
    
    export default MyConponent;

    실행결과

    비구조화 할당 문법을 통해 props 내부 값 추출하기

    비구조화 할당은 구조 분해 문법이라고도 하며, 자세한 내용은 https://ko.javascript.info/destructuring-assignment#ref-749 에서 확인해보세요!

    const MyConponent = (props) => {
     const { name, children } = props; // 비구조화 할당 문법을 사용해서 props 내부 값 추출
     return (
       <div>
         안녕하세요, 제 이름은 {name} 입니다. children 값은 {children}
       </div>
     );
    };
    
    MyConponent.defaultProps = {
     name: " 기본 이름 "
    };
    
    export default MyConponent;

    함수의 파라미터 부분에서도 사용할 수 있습니다. 함수의 파라미터가 객체라면 그 값을 바로 비구조화해서 사용하는 방법입니다. 아주 편리한 방법입니다.

    const MyConponent = ({ name, children }) => {
     return (
       <div>
         안녕하세요, 제 이름은 {name} 입니다. children 값은 {children}
       </div>
     );
    };
    
    MyConponent.defaultProps = {
     name: " 기본 이름 "
    };
    
    export default MyConponent;

    propTypes 를 통한 props 검증

    컴포넌트의 필수 props를 지정하고나 props 의 타입(type)을 지정할 때 사용합니다.

    // Myconponent.js
    import PropsTypes from "prop-types"; //propsTypes를 사용하기 위해서 import 해야 합니다
    
    const MyConponent = ({ name, children }) => {
     return (
       <div>
         안녕하세요, 제 이름은 {name} 입니다. children 값은 {children}
       </div>
     );
    };
    
    MyConponent.defaultProps = {
     name: " 기본 이름 "
    };
    
    MyConponent.prototype = {
     name: PropsTypes.string // name 값은 반드시 string 형태여야 함을 의미합니다.
    };
    
    export default MyConponent;
    // App.js
    import Mycomponent from "./MyComponent";
    
    const App = () => {
     return <Mycomponent name={3}>짬뽕먹고싶다</Mycomponent>; 
    };
    // name 값을 문자열이 아닌 숫자로 전달해 봅니다.
    export default App;


    값이 나타나기는 하지만 개발자 도구를 열어서 Console 탭을 확인해보면 Warning : Faild prop type 이라는 경고 메세지를 확인할 수 있습니다. 개발자에게 propTypes가 잘못되었음을 알려줍니다. 코드샌드박스를 사용하는 중인데 여기서는 경고 메세지가 나오지 않네요 ..

    isRequired를 사용해서 필수 propTypes 설정하기

    //Myconponent.js
    import PropsTypes from "prop-types";
    
    const MyConponent = ({ name, favoriteNumber, children }) => {
     return (
       <div>
         안녕하세요, 제 이름은 {name} 입니다. children 값은 {children} <br />
         좋아하는숫자는 {favoriteNumber}
       </div>
     );
    };
    
    MyConponent.defaultProps = {
     name: " 기본 이름 "
    };
    
    MyConponent.prototype = {
     name: PropsTypes.string,
     favoriteNumber: PropsTypes.number.isRequired //isRequired 를 사용해서 필수 props로 지정
    };
    
    export default MyConponent;


    위 코드는 favoriteNumber를 설정하지 않았기 때문에 console을 확인하면 역시 경고가 타나나게 됩니다.

    클래스형 컴포넌트에서 props 사용하기

    클래스형 컴포넌트에서 props를 사용할 때는 render 함수에서 this.props를 조회하면 됩니다.
    defaultProps와 propTypes는 똑같은 방식으로 사용할 수 있습니다.

    import PropsTypes from "prop-types";
    import { Component } from "react";
    
    class MyConponent extends Component {
     render() {
       const { name, favoriteNumber, children } = this.props; // 비구조화 할당!
       return (
         <div>
           안녕하세요, 제 이름은 {name} 입니다. <br />
           children 값은 {children} 입니다. <br />
           좋아하는 숫자는 {favoriteNumber} 입니다.
         </div>
       );
     }
    }
    
    MyConponent.defaultProps = {
     name: " 기본 이름 "
    };
    
    MyConponent.prototype = {
     name: PropsTypes.string,
     favoriteNumber: PropsTypes.number.isRequired
    };
    
    export default MyConponent;

    참고자료

    리액트를 다루는 기술 (김민준 저자)
    모던 자바스크립트 튜토리얼 https://ko.javascript.info/
    리액트 문서 https://ko.reactjs.org/docs/components-and-props.html

profile
닭이 되고 싶은 병아리
post-custom-banner

0개의 댓글