Front-end/React

React props란? 🎁

xeunnie 2024. 11. 21. 20:11
728x90
반응형

React의 props란 무엇인가요? 🎁

props는 React에서 컴포넌트 간 데이터를 전달하는 방법이에요. “properties”의 줄임말로, 부모 컴포넌트가 자식 컴포넌트에 값을 넘겨주는 데 사용됩니다. props는 읽기 전용(read-only)이기 때문에, 자식 컴포넌트에서 props를 직접 수정할 수 없어요. 이는 데이터의 흐름을 한 방향으로 유지(단방향 데이터 바인딩)할 수 있게 해줍니다.


props는 어떻게 사용하나요? 🛠️

 

props는 부모 컴포넌트가 자식 컴포넌트를 호출할 때 속성(attribute) 형태로 전달됩니다.

자식 컴포넌트는 props 객체를 통해 전달된 데이터를 사용할 수 있어요.

 

기본 예제: props로 데이터 전달하기

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

function App() {
  return <Welcome name="React Developer" />;
}

 

위 코드를 보면, App 컴포넌트는 Welcome 컴포넌트에 name 값을 전달하고,

Welcome은 이 값을 받아 화면에 “Hello, React Developer!”를 출력합니다. 🎉


props의 다양한 활용법 ✨

 

props는 단순히 데이터를 전달하는 것을 넘어, 다양한 방식으로 활용할 수 있습니다.

그럼, props의 매력적인 활용법을 하나씩 살펴볼까요?

 

🌟 1. 비구조화 할당으로 더 깔끔하게!

props 객체에서 특정 값만 추출하려면 비구조화 할당을 활용해보세요. 코드가 더 깔끔해져요!

(비구조 할당이란?)

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

function App() {
  return <Welcome name="React Developer" />;
}

 

이렇게 작성하면 props.name 대신 바로 name을 사용할 수 있어 더 간결합니다.

 

🌟 2. defaultProps: 기본값 설정

 

defaultProps는 props가 전달되지 않았을 때 사용할 기본값을 설정해주는 기능이에요.

 

기본 예제

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

Welcome.defaultProps = {
  name: "Guest",
};

function App() {
  return <Welcome />; // "Hello, Guest!" 출력
}

 

언제 유용할까요?

 

기본값을 지정해두면, 부모 컴포넌트에서 props를 생략했을 때도 컴포넌트가 정상적으로 동작해요.

 

 부모 컴포넌트에서 props를 생략했을 때 오류를 방지

 사용자 경험(UX)을 부드럽게 유지

 

🌟 3. props.children: 태그 사이의 내용을 전달

 

props.children 컴포넌트 태그 사이에 전달된 내용을 나타냅니다. 이를 활용하면 유연한 컴포넌트를 만들 수 있어요.

 

예제: 자식 요소 렌더링하기

function Card({ children }) {
  return <div className="card">{children}</div>;
}

function App() {
  return (
    <Card>
      <h1>Title</h1>
      <p>This is the card content.</p>
    </Card>
  );
}

 

위 예제처럼 유연한 레이아웃을 만드는 데 유용합니다.

 

🌟 4. propTypes: 데이터 타입 검사

React의 propTypes를 사용하면 props의 타입을 명시적으로 정의하고, 잘못된 타입의 데이터를 전달할 경우 경고를 받을 수 있어요.

 

기본 사용법

import PropTypes from "prop-types";

function Welcome({ name, age }) {
  return <h1>{name} is {age} years old.</h1>;
}

Welcome.propTypes = {
  name: PropTypes.string.isRequired, // 필수 prop
  age: PropTypes.number,
};

function App() {
  return <Welcome name="React Developer" age={30} />;
}

주요 propTypes 종류와 상세 설명

Tip: propTypes를 사용하면 협업할 때 코드 안정성과 예측 가능성이 높아져요!

 

1. PropTypes.string

 

 설명: 전달된 prop이 문자열인지 확인합니다.

 예제:

import PropTypes from "prop-types";

function Greeting({ name }) {
  return <h1>Hello, {name}!</h1>;
}

Greeting.propTypes = {
  name: PropTypes.string,
};

// 사용 예시
<Greeting name="John" />; // 정상
<Greeting name={123} />;  // 경고: Expected a string

 

2. PropTypes.number

 

 설명: 전달된 prop이 숫자인지 확인합니다.

 예제:

function AgeDisplay({ age }) {
  return <p>Age: {age}</p>;
}

AgeDisplay.propTypes = {
  age: PropTypes.number,
};

<AgeDisplay age={25} />;  // 정상
<AgeDisplay age="25" />;  // 경고: Expected a number

 

3. PropTypes.bool

 

 설명: 전달된 prop이 불리언 값인지 확인합니다.

 예제:

function Toggle({ isOn }) {
  return <p>{isOn ? "ON" : "OFF"}</p>;
}

Toggle.propTypes = {
  isOn: PropTypes.bool,
};

<Toggle isOn={true} />;  // 정상
<Toggle isOn="true" />;  // 경고: Expected a boolean

 

4. PropTypes.array

 

 설명: 전달된 prop이 배열인지 확인합니다.

 예제:

function ItemList({ items }) {
  return (
    <ul>
      {items.map((item, index) => (
        <li key={index}>{item}</li>
      ))}
    </ul>
  );
}

ItemList.propTypes = {
  items: PropTypes.array,
};

<ItemList items={['Apple', 'Banana']} />; // 정상
<ItemList items="Apple" />;               // 경고: Expected an array

 

5. PropTypes.object

 

 설명: 전달된 prop이 객체인지 확인합니다.

 예제:

function UserProfile({ user }) {
  return <p>{user.name}</p>;
}

UserProfile.propTypes = {
  user: PropTypes.object,
};

<UserProfile user={{ name: "John" }} />; // 정상
<UserProfile user="John" />;            // 경고: Expected an object

 

6. PropTypes.func

 

 설명: 전달된 prop이 함수인지 확인합니다.

 예제:

function Button({ onClick }) {
  return <button onClick={onClick}>Click Me</button>;
}

Button.propTypes = {
  onClick: PropTypes.func,
};

<Button onClick={() => console.log("Clicked!")} />; // 정상
<Button onClick="Not a function" />;               // 경고: Expected a function

 

7. PropTypes.element

 

 설명: 전달된 prop이 React 엘리먼트인지 확인합니다.

 예제:

function Wrapper({ children }) {
  return <div>{children}</div>;
}

Wrapper.propTypes = {
  children: PropTypes.element,
};

<Wrapper>
  <p>This is a child element</p>
</Wrapper>; // 정상

<Wrapper>
  "This is not an element"
</Wrapper>; // 경고: Expected a React element

 

8. PropTypes.oneOf

 

 설명: 전달된 값이 지정된 목록 중 하나인지 확인합니다.

 예제:

function StatusIndicator({ status }) {
  return <p>Status: {status}</p>;
}

StatusIndicator.propTypes = {
  status: PropTypes.oneOf(["online", "offline", "away"]),
};

<StatusIndicator status="online" />;  // 정상
<StatusIndicator status="busy" />;    // 경고: Expected one of ["online", "offline", "away"]

 

9. PropTypes.arrayOf

 

 설명: 전달된 prop이 특정 타입의 배열인지 확인합니다.

 예제:

function Scores({ scores }) {
  return (
    <ul>
      {scores.map((score, index) => (
        <li key={index}>{score}</li>
      ))}
    </ul>
  );
}

Scores.propTypes = {
  scores: PropTypes.arrayOf(PropTypes.number),
};

<Scores scores={[10, 20, 30]} />;  // 정상
<Scores scores={["10", 20, 30]} />; // 경고: Expected an array of numbers

 

10. 기타 PropTypes

 

 PropTypes.shape: 객체의 속성 타입을 정의합니다.

Profile.propTypes = {
  user: PropTypes.shape({
    name: PropTypes.string,
    age: PropTypes.number,
  }),
};

 

 PropTypes.oneOfType: 여러 타입 중 하나를 허용합니다.

Button.propTypes = {
  label: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
};

 

propTypes를 사용하면 컴포넌트 간 데이터 흐름을 더 안전하고 예측 가능하게 만들 수 있어, 유지보수성이 크게 향상됩니다. 😄


함수형 컴포넌트에서 props와 defaultProps 활용 🚀

 

함수형 컴포넌트에서도 props defaultProps를 활용할 수 있어요. 클래스형 컴포넌트와 달리 함수형 컴포넌트는 더 간단한 구조를 가지고 있으며, 코드가 직관적이고 가독성이 높습니다. 특히 React Hook의 등장으로 함수형 컴포넌트에서도 상태 관리와 라이프사이클 관리가 가능해져, 최근에는 함수형 컴포넌트를 사용하는 경우가 많아졌습니다.

 

기본 예제: 함수형 컴포넌트에서 props와 defaultProps

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

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

Welcome.defaultProps = {
  name: "Guest", // 기본값 설정
};

Welcome.propTypes = {
  name: PropTypes.string.isRequired, // 타입과 필수 여부 설정
};

function App() {
  return <Welcome />;
}

export default App;

defaultProps와 propTypes는 꼭 써야 할까요? 🤔

defaultProps

  • props가 생략됐을 때 예기치 않은 오류를 방지.
  • 컴포넌트의 기본 동작을 보장.

propTypes

  • 개발 단계에서 잘못된 데이터 사용을 막아줌.
  • 협업 시 props의 타입을 명확히 정의해 가독성과 유지보수성을 높임.

 

둘 다 필수는 아니지만, 코드의 안정성과 가독성을 높이는 데 강력한 도구가 됩니다! 😄


props의 정리와 활용! ✨

  1. props는 React에서 데이터를 전달하는 필수 도구입니다.
  2. defaultProps와 propTypes로 안정성과 예측 가능성을 확보하세요.
  3. props.children으로 더 유연한 컴포넌트를 만들어보세요.

props를 잘 활용하면, React 앱의 재사용성과 유지보수성을 극대화할 수 있답니다!

앞으로의 React 여정에서도 props는 여러분의 든든한 친구가 될 거예요! 💪

 

🌷전설의 개발자가 되어봅시당! 🌷

728x90
반응형