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๋ ๋ฆฌ์กํธ์ ๋ค์ฌ๋ค๋ฅํ ํ์ ์ผ๋ก, ์ปดํฌ๋ํธ ๊ฐ ๋ฐ์ดํฐ ํ๋ฆ์ ์์ ํ๊ณ ์ ์ฐํ๊ฒ ๊ด๋ฆฌํ๋ ๋ฐ ํต์ฌ์ ์ธ ์ญํ ์ ํฉ๋๋ค.
๐ท์ ์ค์ ๊ฐ๋ฐ์๊ฐ ๋์ด๋ด ์๋น! ๐ท