#1. Props

1. Props의 개념

1) Props란?

  • Props는 Properties(프로퍼티)의 줄임말이다.
  • 상위 컴포넌트가 하위 컴포넌트에 값을 전달할 때 사용한다. (단반향 데이터 흐름을 갖는다.)
  • 프로퍼티는 수정할 수 없다는 특징이 있다. (자식 입장에서는 읽기 전용인 데이터)
  • 프로퍼티에 문자열을 전달할 때는 따옴표(" ")를 사용하고, 문자열 외의 값을 전달할 때는 중괄호({ })를 사용한다.
    • 컴포넌트를 사용하는 부모로 부터 전달 받는 변수값이 포함되어 있는 객체이다.
    • 컴포넌트에게 HTML 속성 같은 형태로 전달된다.

 

2) 컴포넌트 종류

-1. 클래스 컴포넌트

  • React의 오리지널 컴포넌트이다. 함수형태로 정의하는것이 아닌 클래스 형태로 정의 한다.
  • 함수형 컴포넌트 보다 구문이 복잡하고 길다.
  • 함수형 컴포넌트 보다 구문이 좀 더 명확하다.
  • 클래스 안에 LifeCycle 이라는 미리 정해진 함수들을 통해 화면의 갱신 시점이나 변수값의 변경 시점에 화면을 어떻게 처리할지 정의할 수 있다.
class Example extends React.Component {
  render() {
    return <h1>예시입니다. {this.props.name}</h1>;
  }
}

 

-2. 함수형 컴포넌트

  • 클래스 컴포넌트 보다 구문이 간결하지만, 그만큼 더 난해해 질수 있다.
  • 리액트 버전 16 이후에 LifeCycle을 처리할 수 있는 hook이라는 기능이 도입되면서 리액트에서 공식적으로 권장하는 컴포넌트 작성 방법이다.
const Example = (props) => {
  return <h1>예시입니다. {props.name}</h1>;
}

 

2. Props 사용하기

1) 프로퍼티 넘기기

- App.js

import React from "react";
import MyPropsSub from './components/MyPropsSub';  // MyPropsSub.js 참조

function App() {
  return (
    <div>
    
      <MyPropsSub menu="곱창" date="1" />
      <MyPropsSub menu="육회" date={2} />  // 문자열을 넘겨줄 때는 " "를 사용하고 그 외는 { }를 사용한다.
      
    </div>
  );
}

export default App;
  • App.js 컴포넌트에서 MyPropsSub.js 컴포넌트에 menu 와 date 값을 지정하여 프로퍼티로 넘겨준다.
  • 문자열을 넘겨줄 때는 " "를 사용하고 그 외는 { }를 사용한다.

 

- MyPropsSub.js (예시)

import React from "react";

const MyPropsSub = (props) => {
  return (
    <div>
    
      오늘 "{props.menu}" 땡긴다ㅠ 다이어트 {props.date}일 차..
      
    </div>
  );
};

export default MyPropsSub;
  • props라는 매개변수로 App.js에서 프로퍼티 값을 받고, 객체 처럼 사용할 수 있다.

 

※ 출력결과

 

2) 비구조 문법 활용하기

  • 비구조 문법을 통해 변수 속성값을 변수로 선언해서 사용할 수 있다.
  • 처음부터 매개변수에 프로퍼티를 선언하는 방법이다.

- App.js

import React from "react";
import MyPropsSub from './components/MyPropsSub';  // MyPropsSub.js 참조

function App() {
  return (
    <div>

      <MyPropsSub menu="참치회" date="10" />
      <MyPropsSub menu="야채곱창" date={20} />
      
    </div>
  );
}

export default App;

 

- MyPropsSub.js (예시)

import React from "react";

const MyPropsSub = ({menu, date}) => {

  return (
    <div>
    
      오늘 "{menu}" 땡긴다ㅠ 다이어트 {date}일 차..

    </div>
  );
};

export default MyPropsSub;
  • App.js로 부터 넘겨받는 프로퍼티를 매개변수에 바로 선언한다.

 

※ 출력결과

 

3) 기본값 설정

  • defaultProps 를 사용하여 속성값이 전달되지 않을 경우를 대비해서 기본값을 JSON으로 정의해 둘 수 있다.
  • 또는 컴포넌트에 props 기본값을 설정하고 싶은 경우 사용한다.

- App.js

import React from "react";
import MyPropsSub from './components/MyPropsSub';  // MyPropsSub.js 참조

function App() {
  return (
    <div>

      <MyPropsSub />  // 호출만 하고 프로퍼티 값은 지정하지 않았다.
      
    </div>
  );
}

export default App;
  • MyPropsSub 를 호출만 하고 안에 프로퍼티 값은 지정하지 않았다.

 

- MyPropsSub.js (예시)

import React from "react";

const MyPropsSub = ({menu, date}) => {

  return (
    <div>
      오늘 "{menu}" 땡긴다ㅠ 다이어트 {date}일 차..
    </div>
  );
};

export default MyPropsSub;

// 기본값 설정
MyPropsSub.defaultProps = {
  menu: "아무거나",
  date: 7
};
  • defaultProps 를 사용하여 기본값을 설정한다.

 

※ 출력결과

 

4) 데이터 타입과 필수 값 설정

  • 컴포넌트로 전달되는 props 값들에 대한 데이터 타입과 필수 여부를 지정할 수 있다.
  • 기본값 설정을 하지 않는 경우 해당 프로퍼티를 필수 프로퍼티로 선언 할 수 있다.
  • 규칙에 맞지 않는 props 값에 대해 브라우저 개발자 콘솔에 warning 메세지가 출력된다.

 

import PropTypes from "prop-types";
  • 데이터 타입과 필수 값을 설정하기 위해서 prop-types를 import 해야한다.

- MyPropsSub.js (예시)

import React from "react";
import PropTypes from "prop-types";

const MyPropsSub = ({menu, date}) => {

  return (
    <div>
      오늘 "{menu}" 땡긴다ㅠ 다이어트 {date}일 차..
    </div>
  );
};

// 데이터 타입과 필수값 설정
MyPropsSub.propTypes = {

  // menu 속성의 데이터 타입을 문자열 지정
  menu: PropTypes.string,
  
  // date의 데이터 타입을 숫자형으로 지정, 필수 여부 지정
  //-> 필수 여부 설정은 데이터 타입 뒤에 ".isRequired" 를 추가 명시
  date: PropTypes.number.isRequired,

};

export default MyPropsSub;
  • menu 속성은 데이터 타입을 문자형, date 속성은 숫자형으로 지정
  • 필수 여부는 데이터 타입 뒤에 .isRequired 를 추가로 명시하면 된다.

 

- App.js

function App() {
  return (
    <div>
      <MyPropsSub menu="참치회" date="10" />
    </div>
  );
}
  • date 속성의 데이터 타입은 숫자형인데 문자열로 값을 지정

 

※ 출력결과

  • 정상적으로 출력은 되지만 경고 메세지가 뜨는걸 볼 수 있다.

 

3. Props 활용하기

  • 아래 JSON 형식의 데이터를 받아 표를 완성한다.

- GradeData.js (예시)

const GradeData = [
  {"이름": "철수", "학년": 1, "성별": "남자", "국어": 98, "영어": 78, "수학": 88, "과학": 64 },
  {"이름": "영희", "학년": 2, "성별": "여자", "국어": 88, "수학": 62, "과학": 72 },
  {"이름": "민수", "학년": 1, "성별": "남자", "국어": 92, "영어": 70, "수학": 76, "과학": 78 },
  {"이름": "수현", "학년": 3, "성별": "여자", "국어": 63, "영어": 60, "수학": 31 },
  {"이름": "호영", "학년": 4, "성별": "남자", "국어": 88, "영어": 50, "과학": 88 },
];

export default GradeData;

 

- App.js

import React from "react";
import GradeData from "./GradeData";  // GradeData.js 참조
import GradeItem from "./components/GradeItem";  // GradeItem.js 참조


function App() {
  return (
    <div>
      <h1>성적표</h1>
      <hr />
      <table border="1" >  // 테이블 생성
        <thead>
          <tr>
            <th>이름</th>
            <th>학년</th>
            <th>성별</th>
            <th>국어</th>
            <th>영어</th>
            <th>수학</th>
            <th>과학</th>
            <th>총점</th>
            <th>평균</th>
          </tr>
        </thead>
        <tbody align="center">
        
          {/* GradeData의 객체를 map을 활용하여 반복한다 */}
          {GradeData.map((v,i) => {
            return (
              <GradeItem key={i}
              name={v.이름}
              level={v.학년}
              gender={v.성별}
              kor={v.국어}
              eng={v.영어}
              math={v.수학}
              sci={v.과학} />
            )
          })}
        </tbody>
      </table>
    </div>
  );
}

export default App;
  • GradeData.js를 참조하고, map( ) 함수를 활용하여 반복해서 props 값을 GradeItem.js에 넘겨준다.

 

- GradeItem.js (예시)

import React from "react";
import PropTypes from "prop-types";  // 데이터타입 지정과 필수값 설정을 위한 참조

// 비구조문법으로 프로퍼티 값을 호출한다.
const GradeItem = ({name, level, gender, kor, eng, math, sci}) => {
  
  // 점수 합계를 구한다
  const sum = parseInt(kor + eng + math + sci);
  // 점수의 평균을 구한다
  const avg = parseInt(sum / 4);

  // 프로퍼티를 변수로 사용
  return (
    <tr>
      <td>{name}</td>
      <td>{level}</td>
      <td>{gender}</td>
      <td>{kor}</td>
      <td>{eng}</td>
      <td>{math}</td>
      <td>{sci}</td>
      <td>{sum}</td>
      <td>{avg}</td>
    </tr>
  );
};

// 데이터 타입 지정
GradeItem.propTypes = {
  name: PropTypes.string.isRequired,
  level: PropTypes.number.isRequired,
  gender: PropTypes.string.isRequired,
  kor: PropTypes.number,
  eng: PropTypes.number,
  math: PropTypes.number,
  sci: PropTypes.number,
};

// 기본값 지정
GradeItem.defaultProps = {
  kor: 0,
  eng: 0,
  math: 0,
  sci: 0
};

export default GradeItem;
  • 비구조문법으로 App.js 에서 받은 props를 선언하고, 변수로써 사용한다.
  • 데이터가 없는 과목은 기본값을 0점으로 지정한다.

 

※ 출력결과

'국비수업 > React' 카테고리의 다른 글

[React] Hooks  (0) 2022.04.29
[React] CSS 사용하기  (0) 2022.04.26
[React] JSX (JavaScript eXtension)  (0) 2022.04.23
[React] SPA (Single Page Application)  (0) 2022.04.22
[React] React의 기본 구조  (0) 2022.04.21

+ Recent posts