๐ React์ children prop
๋ฆฌ์กํธ์์๋ ๋์ ์ผ๋ก ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง ํ๊ธฐ ์ํด ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ children prop์ ์ด์ฉํ ์ ์์ต๋๋ค.
๋ชจ๋๊ฐ ์ ์๊ณ ์๋ฏ ์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const Children = () => {
return <div>Children</div>;
};
const Parent = ({ children }: { children: JSX.Element }) => {
return <div>{children}</div>;
};
export const Container = () => {
return (
<div>
<Parent>
<Children />
</Parent>
</div>
);
}
์ด๋ฌํ ์ฌ์ฉ ๋ฐฉ์์ React Context์ Provider, BrowserRouter, RecoilRoot๋ฅผ ์ฌ์ฉํ ๋๋ ๋์ผํฉ๋๋ค.
์ฌ๊ธฐ๊น์ง ๋ ์๊ณ ์์๋ ๋ด์ฉ์ ๋๋ค.
๐ Children Prop์ ๋ํ ์๊ตฌ์ฌ
์ ๋ Context๋ฅผ ์ด์ฉํด ๋ชจ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๋ ๋์ค
Context๋ฅผ ๊ฐ๊ณผ ๊ฐ์ ์ค์ ํ๋ Context ๋ ๊ฐ๋ก ๋ถ๋ฆฌํ๋๊ฒ ์ต์ ํ์ ์ด์ ์ด ์๋ค๋ ๊ฒ์ ๋ณด๊ณ
๋ค์๊ณผ ๊ฐ์ด Provider ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๋ ๋์ค ๋ฌธ๋ ์๊ตฌ์ฌ์ด ๋ค์์ต๋๋ค.
<ValueContext.Provider value={...}>
<SetContext.Provider value={...}>
{children}
</SetContext.Provider>
</ValueContext.Provider>
๋ถ๋ช ํ ๋ฆฌ์กํธ์ ๋ฆฌ๋ ๋๋ง ์กฐ๊ฑด์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ฉด ์์ ์ปดํฌ๋ํธ๋ ๋ฆฌ๋ ๋๋ง ๋๋ค๊ณ ์๊ณ ์์๋๋ฐ,
ValueProvider์ value๊ฐ ๋ฐ๋๋ฉด ๊ทธ ์์ ์ปดํฌ๋ํธ์ธ SetContext, children ๋ํ ๊ฐ์ด ๋ฆฌ๋ ๋๋ง ๋๋๊ฑฐ ์๋๊ฐ???
๋ผ๋ ์๊ฐ์ ๊ฝํ ๋ค ์ ์ณ๋๊ณ children prop์ ์๋ ๋ฐฉ์์ ๋ํด ํ๊ณ ๋ค๊ธฐ ์์ํ์ต๋๋ค.
๐ Children Prop์ ์ต์ ํ ํ์
์ ์์ ์์ ์กฐ๊ธ ์์ ํ ์ฝ๋์ ๋๋ค.
import { useState } from "react";
const Children = () => {
console.log("Children ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง");
return <div>Children</div>;
};
const Parent = ({ children }: { children: JSX.Element }) => {
const [state, setState] = useState(false);
const handleClickButton = () => setState(!state);
console.log("Parent ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง");
return (
<div>
<button onClick={handleClickButton}>Parent ์ํ๋ณํ</button>
{children}
</div>
);
};
export const Container = () => {
return (
<div>
<Parent>
<Children />
</Parent>
</div>
);
};
์ ๋ฒํผ์ ๋๋ฌ Parent ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง์ ๋ฐ์์ํค๋ฉด Children ์ปดํฌ๋ํธ๋ ์ด๋ป๊ฒ ๋ ๊น์?
๋๋๊ฒ๋ Children ์ปดํฌ๋ํธ๋ React.memo๋ฅผ ์ฌ์ฉํด ๋ฉ๋ชจ์ด์ ์ด์ ํ ๊ฒ ์ฒ๋ผ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์์์ต๋๋ค!
์ด๋ป๊ฒ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ธ Parent๊ฐ ๋ฆฌ๋ ๋๋ง ๋์๋๋ฐ ์์์ธ Children ์ปดํฌ๋ํธ๋ ๋ฆฌ๋ ๋ ๋์ง ์์์๊น์?
๐ Children Prop, ์ต์ ํ ํ์์ ์ด์
์ ์์ ์์ Container ์ปดํฌ๋ํธ๋ง ๊ฐ์ ธ์์ต๋๋ค.
export const Container = () => {
return (
<div>
<Parent>
<Children />
</Parent>
</div>
);
};
์ด ์ปดํฌ๋ํธ์์ Parent ์ปดํฌ๋ํธ์ children prop์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<div>
<Parent children={Children()} />
</div>
์ด๋ ๊ฒ ํจ์ ํํ๋ก ๋ณด๋ ๋ถ๋ชจ ์์ ๊ด๊ณ์ JSX ํ๊ทธ์ ํํ์ ๋ํด์๋ง ๋งค๋ชฐ๋์ด ๋ณด์ด์ง ์๋ ๊ฒ๋ค์ด ๋ณด์ด๊ธฐ ์์ํฉ๋๋ค.
์ฌ์ค children prop์๋ ๊ทธ์ ํจ์๋ฅผ ํตํด ๋ฐํ ๋ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ฃผ์์ ๋ฟ์ด๊ณ ,
์ด ๊ฐ์ฒด๋ Container ์ปดํฌ๋ํธ์์ ํธ์ถ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋๊น children์ด๋ ๋ง์ ์์ ์์ ๊ฐ์ ๊ณ์ธต ๊ตฌ์กฐ๋ก ์๊ฐํ ์ ์์ง๋ง
์ค์ ๋ก๋ ์๋์ ๊ฐ์ ๊ณ์ธต ๊ตฌ์กฐ๋ก ๋์ด ์๋ ๊ฒ์ด์ฃ .
๊ทธ๋ฌ๋ Children ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ ค๋ฉด Parent ์ปดํฌ๋ํธ๊ฐ ์๋๋ผ
์ค์ ๋ถ๋ชจ์ธ Container ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋์ด์ผ ํฉ๋๋ค.
๊ทธ๋ผ ์ด ์๋ฆฌ๋ฅผ ์ด์ฉํด ๋ฆฌ๋ ๋๋ง์ด ์ ์ Container์ children props๋ฅผ ์ด์ฉํ๋ ์ปดํฌ๋ํธ๋ฅผ ์๋ง ์ด์ฉํ๋ค๋ฉด
๋ฉ๋ชจ์ด์ ์ด์ ๊ณผ ์ ์ฌํ ๋ ๋๋ง ์ต์ ํ ํ์์ ์ ๋ํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๋๊ธ