공부방

Props 응용 본문

카테고리 없음

Props 응용

코딩 화이팅 2023. 8. 30. 13:59

생각한 값들만 props로 전달해야 할 경우

Status.tsx
type StatusProps = {
  status: string;
};

export const Status = (props: StatusProps) => {
  let message;
  if (props.status === "loading") {
    message = "Loading...";
  } else if (props.status === "success") {
    message = "데이터 불러오기 성공";
  } else if (props.status === "error") {
    message = "데이터 불러오는데 에러 발생";
  }

  return (
    <div>
      <h2>Status - {message}</h2>
    </div>
  );
};
App.tsx
import "./App.css";
import { Status } from "./components/Status";

function App() {
  return (
    <div className="App">
      <Status status="loading"></Status>
    </div>
  );
}

export default App;

저 3가지 상태가 아닌 다른 값들을 props로 보내면 아무것도 없는 상태이기 때문에 3가지의 상태만 props로 전달되게 하기

Status.tsx
type StatusProps = {
  status: "loading" | "success" | "error";
};

export const Status = (props: StatusProps) => {
  let message;
  if (props.status === "loading") {
    message = "Loading...";
  } else if (props.status === "success") {
    message = "데이터 불러오기 성공";
  } else if (props.status === "error") {
    message = "데이터 불러오는데 에러 발생";
  }

  return (
    <div>
      <h2>Status - {message}</h2>
    </div>
  );
};
App.tsx
import "./App.css";
import { Status } from "./components/Status";

function App() {
  return (
    <div className="App">
      <Status status="dkdfjdk"></Status>
      이렇게 적으면 빨간줄이 뜨면서 에러가 난다.
    </div>
  );
}

export default App;

children 타입으로 props 전송

Heading.tsx
type HeadingProps = {
  children: string;
};

export const Heading = (props: HeadingProps) => {
  return <h2>{props.children}</h2>;
};
App.tsx
import "./App.css";
import { Heading } from "./components/Heading";
import { Status } from "./components/Status";

function App() {
  return (
    <div className="App">
      <Status status="loading"></Status>
      <Heading>이렇게 컴포넌트로 children 타입을 보낸다.</Heading>
    </div>
  );
}

export default App;

컴포넌트 안에 컴포넌트 넣기

Oscar.tsx
type OscarProps = {
  children: React.ReactNode;
};

export const Oscar = (props: OscarProps) => {
  return <div>{props.children}</div>;
};
App.tsx
import "./App.css";
import { Heading } from "./components/Heading";
import { Oscar } from "./components/Oscar";
import { Status } from "./components/Status";

function App() {
  return (
    <div className="App">
      <Status status="loading"></Status>
      <Heading>이렇게 컴포넌트로 children 타입을 보낸다.</Heading>
      <Oscar>
        <Heading>Oscar는 내꺼다.</Heading>
      </Oscar>
    </div>
  );
}

export default App;

컴포넌트에서 한 타입을 빼고 싶을 때

Greet.tsx
type GreetProps = {
  name: string;
  messageCount?: number;
  // ?를 넣어서 뺄수도 있게 만들어준다.
  isLoggedIn: boolean;
};
// Props의 type을 정해주기 위해 GreetProps를 정해준다.

export const Greet = (props: GreetProps) => {
  // props부분에 위에 지정해준 GreetProps를 넣어준다.
  const { messageCount = 0 } = props;
  // 메시지 수를 이렇게 설정해주고 props라고 설정해주면
  return (
    <div>
      <h2>
        {/* 삼항연산자 */}
        {props.isLoggedIn
          ? `${props.name} 안 읽은 메세지가 ${messageCount}개가 있어.`
          // props.을 안 붙여줄 수 있다.
          : "Welcome Guest"}
      </h2>
    </div>
  );
};
App.tsx
import "./App.css";
import { Greet } from "./components/Greet";
import { Heading } from "./components/Heading";
import { Oscar } from "./components/Oscar";
import { Status } from "./components/Status";

function App() {
  return (
    <div className="App">
      <Status status="loading"></Status>
      <Heading>이렇게 컴포넌트로 children 타입을 보낸다.</Heading>
      <Oscar>
        <Heading>Oscar는 내꺼다.</Heading>
      </Oscar>
      <Greet name="강현" isLoggedIn={false} />
      {/* 원래 Greet 컴포넌트에는 이름, 메세지 갯수, 로그인 여부가 들어가지만
      Greet 컴포넌트에서 messageCount에 ?를 넣어놔서 뺄 수 있도록 만들어줌. */}
    </div>
  );
}

export default App;