ํ์ฌ์์ 4deps์ ์นดํ ๊ณ ๋ฆฌ ๊ธฐ๋ฅ์ ๋ง๋ค์ด์ผ ํ๋๋ฐ ์ฌ๊ท ์ปดํฌ๋ํธ๋ฅผ ํ์ฉํด ๋ฐ๋ณต ์ฝ๋๋ฅผ ์ค์ผ ์ ์์์ต๋๋ค. 4deps๋ฅผ ๊ธฐ์ค์ผ๋ก ์ก์์ง๋ง ์ฌ๊ท๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช deps๋ ๋ณด์ฌ์ค ์ ์์ฃ ! ์ฑ๋ฅ์ ์ธ ๋ฌธ์ ๋ ๋ณ๊ฐ์ง๋ง ๋ธ๋ผ์ฐ์ ์ ์ฑ๋ฅ์ด ๋ฐ๋ฌํ๋ฉด์ ์ด์ ๋๋ ๋ฌธ์ ๊ฐ ์๋ค ํ๋จํ์ต๋๋ค.
์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ
์ฌ๊ท๋ ์๊ณ ๋ฆฌ์ฆ์ ํ๋๋ก ์ฃผ๋ก ์ฝ๋ฉํ ์คํธ ๋ฌธ์ ๋ฅผ ํ ๋ ๋ง์ด ์ ํ ์ ์๋๋ฐ, ๊ฐ์ฅ ๋ํ์ ์ธ ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ฌ๋ก๋ก๋ ํผ๋ณด๋์น ์์ด์ด ์๋ค.
const fibonacci = (num: number) => {
if (num < 2) {
return num;
}
return fibonacci(num - 1) + fibonacci(num - 2);
};
- ๊ฐ๋จํ๊ฒ ์ค๋ช ํ์๋ฉด "์๊ธฐ ์์ ์ ํธ์ถํ๋ ํจ์"๋ฅผ ์ฌ๊ท ํจ์๋ผ๊ณ ํ ์ ์๋ค.
- ํผ๋ณด๋์น ์์ด์ 0๊ณผ 1๋ก ์์ํด์ ๋์ด๋๋ ์๋ก n์ ๊ตฌํ๊ณ ์ถ์ผ๋ฉด n์ ์ง์ ๋๊ฐ์ ๊ฐ์ ํฉํด์ฃผ๋ฉด ๋๋ค.
์ฌ๊ท ์ปดํฌ๋ํธ ์์
๊ทธ๋ผ ์ด ์ฌ๊ท๋ฅผ ์ด์ฉํด์ "๋ ์์ ์ ํธ์ถํ๋ ์ปดํฌ๋ํธ"๋ฅผ ๋ง๋ค์ด์ฃผ๋ฉด ์ฌ๊ท ์ปดํฌ๋ํธ๊ฐ ๋๋ค!
export interface Category {
name: string;
children?: Category[] | null;
}
const DUMMY_CATEGORY: Category[] = [
{
name: "๋๋ฏธ๋ฐ์ดํฐ1",
children: [
{
name: "๋๋ฏธ๋ฐ์ดํฐ1-2",
children: [
{
name: "๋๋ฏธ๋ฐ์ดํฐ1-3",
children: [{ name: "๋๋ฏธ๋ฐ์ดํฐ1-4", children: null }],
},
],
},
],
},
{
name: "๋๋ฏธ๋ฐ์ดํฐ2",
children: [{ name: "๋๋ฏธ๋ฐ์ดํฐ2-2", children: null }],
},
];
- ๋จผ์ ์ฌ์ฉํ ํ์ ๊ณผ ๋๋ฏธ์ฉ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด์ค๋ค.
- ๊ฐ๋จํ๊ฒ ์นดํ ๊ณ ๋ฆฌ์ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์๊ณ ํ์ ์นดํ ๊ณ ๋ฆฌ๊ฐ ์์๊ฒฝ์ฐ children ํ๋กํผํฐ๋ฅผ ํตํด ๋ค์ ๋ฐฐ์ด์ ์ฃผ๋ ํํ์ด๋ค.
import { Fragment } from "react";
import { Category } from "../App";
const CategoryItem = ({ data }: { data: Category[] }) => {
return (
<>
{data.map((item) => (
<Fragment key={item.name}>
{item.name}
{Array.isArray(item.children) && (
<CategoryItem data={item.children} />
)}
</Fragment>
))}
</>
);
};
export default CategoryItem;
- ์ฌ์ฉํ CategoryItem ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๊ณ props๋ฅผ ํตํด ๋ฐ์ data๋ฅผ ํตํด map์ ๋๋ฉฐ name์ ๋ณด์ฌ์ฃผ๊ณ
- isArray๋ฅผ ํตํด children ๋ฐฐ์ด์ด ์กด์ฌํ ๊ฒฝ์ฐ ๋ค์ CategoryItem ์ปดํฌ๋ํธ๋ฅผ ํธ์ถํ๋ฉฐ data์ children ํ๋กํผํฐ๋ฅผ ๋๊ฒจ์ค๋ค. ์ด๋ฌ๋ฉด ๋ด๋ ค์ค children ํ๋กํผํฐ์ ๋ํด ๋ค์ map์ ๋๊ณ ๋ ๋ด๋ถ์ children์ด ์์ผ๋ฉด map์ ๋๋ ํํ๊ฐ ์์ฑ๋๋ค.
- ๋ง์ฝ ์ฌ๊ท๋ฅผ ์ด์ฉํ์ง ์๋๋ค๋ฉด map...map...map...map์ ๋์์ผํ๋ค. ์นดํ ๊ณ ๋ฆฌ deps๊ฐ ์ ํด์ ธ ์์ง ์๋ค๋ฉด ๋ต์ ์ฌ๊ท๋ฐ์ ์๋ค.
์ ์ฒด ์ฝ๋
// components/CategoryItem.tsx
import { Fragment } from "react";
import { Category } from "../App";
const CategoryItem = ({ data }: { data: Category[] }) => {
return (
<>
{data.map((item) => (
<Fragment key={item.name}>
{item.name}
{Array.isArray(item.children) && (
<CategoryItem data={item.children} />
)}
</Fragment>
))}
</>
);
};
export default CategoryItem;
import { Fragment, useState } from "react";
import CategoryItem from "./components/CategoryItem";
export interface Category {
name: string;
children?: Category[] | null;
}
const DUMMY_CATEGORY: Category[] = [
{
name: "๋๋ฏธ๋ฐ์ดํฐ1",
children: [
{
name: "๋๋ฏธ๋ฐ์ดํฐ1-2",
children: [
{
name: "๋๋ฏธ๋ฐ์ดํฐ1-3",
children: [{ name: "๋๋ฏธ๋ฐ์ดํฐ1-4", children: null }],
},
],
},
],
},
{
name: "๋๋ฏธ๋ฐ์ดํฐ2",
children: [{ name: "๋๋ฏธ๋ฐ์ดํฐ2-2", children: null }],
},
];
function App() {
const [data] = useState<Category[]>(DUMMY_CATEGORY);
return (
<>
<h1>์นดํ
๊ณ ๋ฆฌ ๋ชฉ๋ก</h1>
{data.map((item) => (
<Fragment key={item.name}>
<p>{item.name}</p>
{Array.isArray(item.children) && (
<CategoryItem data={item.children} />
)}
</Fragment>
))}
</>
);
}
export default App;
ETC
์๊ณ ๋ฆฌ์ฆ์ ํ๋ก ํธ์๋ ๊ตฌํ์์ ์ ์ฉ ํด ๋ณธ์ ์ด ์์๋๋ฐ ์์ฃผ ์ข์ ๊ฒฝํ์ด์๋ค. ๋ค๋ง ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ๋ณต์ก๋๊ฐ ํ์ฌ๋ ๋ฐ๋ณต๋ฌธ ์์ ๋ฐ๋ณต๋ฌธ ํํ์ด๊ธฐ์ O(n)์ผ๋ก ์ถฉ๋ถํ์ง๋ง ํผ๋ณด๋์น๊ธ์ ์๊ฐ๋ณต์ก๋๋ผ๋ฉด ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ด๋ป๊ฒ ์์ผ์ผํ ๊น.. ๋ถ๋ช DP์ ๋ํด ๊ณต๋ถํ์๋๋ฐ ์ฌ์ฉ์ ์ํ๋ ์ ๋ถ ๊น๋จน๋ ๊ฒ ๊ฐ๋ค๐ ๋ฐ๋ณตํด์ ๊ณต๋ถํด์ผ์ง
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Webpack] React + Typescript + Webpack(v5) ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ๋ง๋ค๊ธฐ - 1 (0) | 2023.12.15 |
---|---|
[Tailwind CSS] Tailwind ์๋์์ฑ ์กฐ๊ธ ๋ ํธํ๊ฒ ์ฐ๋ ๋ฐฉ๋ฒ (1) | 2023.11.03 |
[React] debounce (feat. lodash) (0) | 2023.01.24 |
[React]useState (0) | 2022.11.16 |
[React]useLocation (0) | 2022.11.02 |