Front-end/React

[React] ReactNode: ๋ฆฌ์•กํŠธ์˜ ๋งŒ๋Šฅ ๋ฐ์ดํ„ฐ ํƒ€์ž…!๐Ÿ“š

xeunnie 2024. 12. 25. 01:00
728x90
๋ฐ˜์‘ํ˜•

ReactNode ํ†บ์•„๋ณด๊ธฐ! ๐ŸŒŸ

React๋ฅผ ์“ฐ๋‹ค ๋ณด๋ฉด ReactNode๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์ข…์ข… ๋ณด๊ฒŒ ๋˜์ฃ . ์ด๊ฒƒ์€ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ‘œํ˜„ํ•˜๋Š” ํƒ€์ž…์ด์—์š”. ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ๋…ธ๋“œ(node)๋ผ๋Š” ๊ฐœ๋…์€ DOM ํŠธ๋ฆฌ์—์„œ ๊ฐ€์ ธ์˜จ ๊ฑด๋ฐ, ReactNode๋Š” ๋ฆฌ์•กํŠธ ์„ธ๊ณ„์—์„œ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•ด์š”. ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ prop์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ReactNode๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ด๊ณ , ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์ฃ . ์˜ค๋Š˜์€ ReactNode๋ฅผ ์†์†๋“ค์ด ํŒŒํ—ค์ณ ๋ด…์‹œ๋‹ค!


๐Ÿ“š ReactNode๋ž€?

ReactNode๋Š” ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ReactNode๋Š” JSX.Element์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋” ๋„“์€ ๋ฒ”์œ„๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์š”.

 

React ๊ณต์‹ ํƒ€์ž… ์ •์˜๋ฅผ ๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

type ReactNode = ReactElement | string | number | boolean | null | undefined;

 

  • ReactElement: JSX๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋˜๋Š” ๋ฆฌ์•กํŠธ ์—˜๋ฆฌ๋จผํŠธ
  • string: ํ…์ŠคํŠธ ๋…ธ๋“œ
  • number: ์ˆซ์ž ๋…ธ๋“œ
  • boolean: false๋Š” ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Œ
  • null / undefined: ์•„๋ฌด๊ฒƒ๋„ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Œ

๐Ÿ‘‰ ReactNode๋Š” JSX ์•ˆ์—์„œ ‘๋ Œ๋”๋ง๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ’์„ ๋‹ค๋ฃฌ๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“ฆ ReactNode๋กœ ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋“ค

1. React ์—˜๋ฆฌ๋จผํŠธ

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋‚˜ DOM ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

function App(): ReactNode {
  return <h1>Hello, ReactNode!</h1>;
}

2. ๋ฌธ์ž์—ด

ํ…์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

function App(): ReactNode {
  return "Hello, world!";
}

3. ์ˆซ์ž

์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

function App(): ReactNode {
  return 12345;
}

 

4. null๊ณผ undefined

์•„๋ฌด๊ฒƒ๋„ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

function App(): ReactNode {
  return null; // ํ™”๋ฉด์— ์•„๋ฌด๊ฒƒ๋„ ํ‘œ์‹œ๋˜์ง€ ์•Š์Œ
}

5. ๋ถˆ๋ฆฌ์–ธ ๊ฐ’

false์™€ true ๋ชจ๋‘ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

function App(): ReactNode {
  return false; // ํ™”๋ฉด์— ์•„๋ฌด๊ฒƒ๋„ ํ‘œ์‹œ๋˜์ง€ ์•Š์Œ
}

 

6. ๋ฐฐ์—ด

์—ฌ๋Ÿฌ ReactNode๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function App(): ReactNode {
  return [
    <h1 key="1">Hello</h1>,
    <h2 key="2">World</h2>,
  ];
}

๐Ÿงฉ ReactNode์™€ JSX.Element์˜ ์ฐจ์ด

ReactNode

  • ๋” ๋„“์€ ๋ฒ”์œ„๋ฅผ ํฌ๊ด„ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌธ์ž์—ด, ์ˆซ์ž, null, undefined ๋“ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

JSX.Element

  • ๋ฆฌ์•กํŠธ๊ฐ€ JSX๋กœ ์ƒ์„ฑํ•œ ReactElement๋งŒ์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„๊ต ์˜ˆ์‹œ:

const node: ReactNode = "Hello"; // ๊ฐ€๋Šฅ
const element: JSX.Element = "Hello"; // ์˜ค๋ฅ˜ ๋ฐœ์ƒ!

๐Ÿ› ๏ธ ReactNode์˜ ์‹ค๋ฌด ํ™œ์šฉ

1. ํƒ€์ž… ์•ˆ์ „ํ•œ children ๊ด€๋ฆฌ

ReactNode๋Š” ์ฃผ๋กœ children์˜ ํƒ€์ž…์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

type CardProps = {
  children: ReactNode;
};

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

// ์‚ฌ์šฉ
<Card>
  <h1>Title</h1>
  <p>This is a card</p>
</Card>;

 

2. ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง

ReactNode๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์กฐ๊ฑด๋ถ€๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”.

function Greeting({ name }: { name?: string }): ReactNode {
  return name ? <h1>Hello, {name}!</h1> : null;
}

 

3. ๋ณต์žกํ•œ ๊ตฌ์„ฑ ์š”์†Œ

ReactNode๋Š” ๋‹ค์–‘ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ฐฐ์—ด์ด๋‚˜ ์กฐ๊ฑด๋ฌธ์„ ํ†ตํ•ด ์œ ์—ฐํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function RenderItems({ items }: { items: ReactNode[] }): ReactNode {
  return <ul>{items.map((item, index) => <li key={index}>{item}</li>)}</ul>;
}

// ์‚ฌ์šฉ
<RenderItems items={["Apple", "Banana", "Cherry"]} />;

๐Ÿง ReactNode์˜ ํ•œ๊ณ„

ReactNode๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํฌํ•จํ•˜๊ธด ํ•˜์ง€๋งŒ, ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’๊นŒ์ง€ ๋ Œ๋”๋งํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์„ ์•Œ์•„์•ผ ํ•ด์š”.

 

๋ Œ๋”๋งํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’

  • ๊ฐ์ฒด(ReactElement๋Š” ์ œ์™ธ)
  • ํ•จ์ˆ˜
function App(): ReactNode {
  return {}; // ์˜ค๋ฅ˜ ๋ฐœ์ƒ
}

function App(): ReactNode {
  return () => "Hello"; // ์˜ค๋ฅ˜ ๋ฐœ์ƒ
}

โš ๏ธ ์ฃผ์˜ํ•  ์ 

1. ReactNode์™€ TypeScript์˜ ํ˜‘๋ ฅ

ReactNode๋Š” ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ์ถ”๋ก ๋งŒ์œผ๋กœ๋Š” ์ •ํ™•ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด์š”. ์ด๋Ÿฐ ๊ฒฝ์šฐ ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž…์„ ์ง€์ •ํ•˜์„ธ์š”.

2. ๋ถˆํ•„์š”ํ•œ ReactNode ๋ณ€ํ™˜

์ด๋ฏธ JSX.Element๋กœ ์ถฉ๋ถ„ํžˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ReactNode๋ฅผ ๋‚จ๋ฐœํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ํƒ€์ž… ํ™•์žฅ์€ ์ฝ”๋“œ ๋ณต์žก๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ReactNode๋Š” ๋ฆฌ์•กํŠธ์˜ ๋‹ค์žฌ๋‹ค๋Šฅํ•œ ํƒ€์ž…์œผ๋กœ, ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์•ˆ์ „ํ•˜๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

๐ŸŒท์ „์„ค์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ด…์‹œ๋‹น! ๐ŸŒท

728x90
๋ฐ˜์‘ํ˜•