React 리액트

컴포넌트(2) props (properties) 사용법

dev.mk 2023. 9. 4. 15:13
반응형

 

1. 프로퍼티(props)란?
 - 프로퍼티, props(properties의 줄임말) 라고 한다.
 - 상위 컴포넌트가 하위 컴포넌트에 값을 전달할때 사용한다. (단방향 데이터 흐름 갖는다.)
 - 프로퍼티는 수정할 수 없다는 특징이 있다. (자식입장에선 읽기 전용인 데이터이다.)

 

src/App.js

import React, { Component } from 'react'; // 리액트를 구현할 수 있는 플러그인을 연결
import Header from './component/Header';
import Footer from './component/Footer';
import Main from './component/Main';

// JS파일에 외부 파일을 불러오는 것이기 때문에 "import" 키워드를 사용한다. 
// 같은 JS파일은 확장자를 사용하지 않는다. 

function App() {
  return (
    <div>
      <Header />
          <Main name="2023.09" color="blue" useYn/>
          <Main name="Dev.MK" color="black"/>
          <Main name={10000}/>
      <Footer />
    </div>
  );
}

export default App; //다른 JS파일에서 불러올 수 있도록 내보내주기

 

name , color 란 key명으로 Main.js에 props값을 넘길 수 있다. 

 

props를 접근하여 값을 가져오기

/src/Main.js

import React from 'react';
import PropTypes from 'prop-types' // 프로퍼티 타입을 지정해주기 위해 사용 한다.

function Main(props) {

    const msg = useYn ? '사용' : '미사용'; // 불리언 사용
    
    return (
        <div>
            <main>
                <h1 style={{color: props.color}}>안녕하세요. {props.name} 입니다. ({msg})</h1>
            </main>
        </div>
    );
}

Main.propTypes = {
    name: PropTypes.string.isRequired
}

Main.defaultProps = {
    name: '디폴트'
}
export default Main; //다른 JS파일에서 불러올 수 있도록 내보내주기

값을 가져올때는 props.key명으로 가져온다.

 

 

javascript의 비구조화 할당으로 값을 가져오기

import React from 'react';
import PropTypes from 'prop-types' // 프로퍼티 타입을 지정해주기 위해 사용 한다.

function Main({color, name, useYn}) {

    const msg = useYn ? '사용' : '미사용'; // 불리언 사용
    
    return (
        <div>
            <main>
                <h1 style={{color}}>안녕하세요. {name} 입니다. ({msg})</h1>
            </main>
        </div>
    );
}

Main.propTypes = {
    name: PropTypes.string.isRequired
}

Main.defaultProps = {
    name: '디폴트'
}
export default Main; //다른 JS파일에서 불러올 수 있도록 내보내주기

props을 생략하고 key명으로만 값을 가져올 수 있다.

 

2. propTypes와 defailtProps

pros의 대한 옵션설정이고 생략 할 수있다.

propTypes는 데이터형을 지정 및 필수값 유무를 지정할 수 있다.

name: PropTypes.string.isRequired 은  name이란 props key는 문자열이고 필수로 값을 설정해야한다.

string인데 불구하고 숫자형으로 값을 보내면

Failed prop type: Invalid prop `name` of type `number` supplied to `Main`, expected `string`.

에러가 발생한다.

defailtProps는 props의 디폴트 값을 설정할 수 있다.

<h1 style={{color}}>안녕하세요. {name} 입니다. ({msg})</h1>에 name을 지정했지만

보내는곳에서 값을 보내지 않았을때 default 값이 표시된다.

 

 

#결과

 

 

3. props.children 사용하기

Main컴포넌트를 Wrapper 컴포넌트가 감싸고 Main의 엘리먼트를 가져오려면 children을 사용해야한다.

마찬가지로 props로 접근하거나 비구조화 할당방법으로 엘리먼트를 가져올 수 있다.

 

src/App.js

import React, { Component } from 'react'; // 리액트를 구현할 수 있는 플러그인을 연결
import Header from './component/Header';
import Footer from './component/Footer';
import Main from './component/Main';
import Wrapper from './component/Wrapper';

// JS파일에 외부 파일을 불러오는 것이기 때문에 "import" 키워드를 사용한다. 
// 같은 JS파일은 확장자를 사용하지 않는다. 

function App() {
  return (
    <div>
      <Header />
          <Wrapper>
              <Main name="2023.09" color="blue" useYn/>
              <Main name="Dev.MK" color="black"/>
              <Main name={10000}/>
              <Main/>
          </Wrapper>
      <Footer />
    </div>
  );
}

export default App; //다른 JS파일에서 불러올 수 있도록 내보내주기

 

 

props.children 사용하여 값을 가져오기

src/component/Wrapper.js

import React from 'react';
import PropTypes from 'prop-types' // 프로퍼티 타입을 지정해주기 위해 사용 한다.

//1번째 방법 ( props.children 사용 )
function Wrapper(props) {

    const style = {
        backgroundColor: 'yellow',
      };
    
    return (
        <div style={style}>
            {props.children}
        </div>
    );
}

export default Wrapper;

 

javascript의 비구조화 할당으로 값을 가져오기

src/component/Wrapper.js

import React from 'react';
import PropTypes from 'prop-types' // 프로퍼티 타입을 지정해주기 위해 사용 한다.

//2번째방법 비구조화 할당방법
function Wrapper({children}) {
    const style = {
        backgroundColor: 'yellow',
      };
    
    return (
        <div style={style}>
            {children}
        </div>
    );
}

//반대로 하나의 자식만 요구할 수도 있음
Wrapper.propTypes = {
    children: PropTypes.element.isRequired
};

export default Wrapper;

 

현재 App.js에 Wrapper컴포넌트 하위에는 Main 컴포넌트 구조

<Wrapper>
  <Main name="2023.09" color="blue" useYn/>
  <Main name="Dev.MK" color="black"/>
  <Main name={10000}/>
  <Main/>
</Wrapper>

children: PropTypes.element.isRequired 이 옵션은 모든 칠드런 엘리먼트를 출력하는것이 아니라 1개의 칠드런만 허용한다는 뜻이다. 그래서 현재 Main 컴포넌트가 Wrapper컴포넌트 하위로 4개가 있기 때문에 아래의 오류가 발생한다.

 Invalid prop `children` of type `array` supplied to `Wrapper`, expected a single ReactElement.

 

 

#결과

 

 

반응형