๐ [Recat] React ํต์ฌ - ์ฌํ๋จ๊ณ
![๐ [Recat] React ํต์ฌ - ์ฌํ๋จ๊ณ](/assets/img/thumbnail/react-thumbnail.jpg)
[Recat] React ํต์ฌ - ์ฌํ๋จ๊ณ
ย Fragments(ํ๋๊ทธ๋จผํธ) ์ฌ์ฉ๋ฒ
๋ค์ ์ฝ๋๋ ์ค๋ฅ ๋ฐ์
ย return (
<Header />
<main>...</main>
);
๋ ๊ฐ์ ํ์ ์์๋ฅผ ๋ฐํํ๋ ค ํ๊ธฐ ๋๋ฌธ์ JSX ์๋ฌ ๋ฐ์
โ JSX expressions must have one parent element
- JSX๋ ๊ฒฐ๊ตญ
React.createElement(...)
ํธ์ถ๋ก ๋ณํ๋จ - ํจ์๊ฐ ๋ ๊ฐ ์ด์์ ๊ฐ์ ๋ฐํํ ์ ์๋ฏ์ด,
JSX๋ ํ๋์ ์์๋ง ๋ฐํ ๊ฐ๋ฅํด์ผ ํจ
ํด๊ฒฐ์ฑ
1: ๋ถํ์ํ <div>
๋ก ๊ฐ์ธ๊ธฐ
return (
<div>
<Header />
<main>...</main>
</div>
);
- ์ค๋ฅ๋ ํด๊ฒฐ๋์ง๋ง, ๋ถํ์ํ div๊ฐ DOM์ ์๊น
ํด๊ฒฐ์ฑ
2: React.Fragment
์ฌ์ฉ
import { Fragment } from 'react';
return (
<Fragment>
<Header />
<main>...</main>
</Fragment>
);
- ์ค์ ๋ก ๋ ๋๋ง๋์ง ์๋ ๊ฐ์์ ์์
- DOM์ ์๋ฌด๊ฒ๋ ๋จ๊ธฐ์ง ์์
ํด๊ฒฐ์ฑ
3: ์ถ์ฝ ๋ฌธ๋ฒ <> ... </>
return (
<>
<Header />
<main>...</main>
</>
);
Fragment
์ ์ถ์ฝํ- ๋๋ถ๋ถ์ ์ต์ React ํ๋ก์ ํธ์์ ์ฌ์ฉ ๊ฐ๋ฅ
- ๊ฐ์ฅ ๊น๋ํ๊ณ ๊ฐํธํ ๋ฐฉ๋ฒ
๊ฐ์ธ์ง ์์์ Props(์์ฑ) ์ ๋ฌํ๊ธฐ
function Wrapper({ title, children, ...props }) {
return <section {...props}>...</section>;
}
title
,children
์ ์ง์ ๊บผ๋ด ์ฌ์ฉ- ๋๋จธ์ง ๋ชจ๋ props๋
props
๊ฐ์ฒด์ ์๋ ์์ง๋จ - ์์ง๋ props๋
<section>
์...props
๋ก ์ ๋ฌ๋จ ๐ ํจ๊ณผ:<Wrapper id="examples" className="my-section" />
๋ฑ์ ์ถ๊ฐ props๋ ์๋ ์ ๋ฌ๋จ
function TabButton({ children, ...props }) {
return <button {...props}>{children}</button>;
}
- ์ธ๋ถ์์ ์ ๋ฌ๋
onClick
,className
,type
๋ฑ ๋ชจ๋ props๋ฅผ ์๋ ์ ๋ฌ - ๋ด๋ถ์์๋ ๋ณ๋๋ก prop์ ๊บผ๋ด์ง ์์๋ ๋จ
- ์ด ํจํด์ ๋ด์ฅ ์์์ ๊ทธ๋๋ก ์ ๋ฌํ ์์ฑ์ด ๋ง์ ๋ ํนํ ์ ์ฉ
์ปดํฌ๋ํธ ํ์ ๋์ ์ผ๋ก ์ค์ ํ๊ธฐ
๋์ ์ผ๋ก ์ปดํฌ๋ํธ๋ HTML ํ๊ทธ๋ฅผ props๋ก ์ ๋ฌํ ์ ์๋ค
์: <Tabs buttonsContainer="menu" />
buttonsContainer
๋ ๋ฌธ์์ด"menu"
๋ก, HTML ํ๊ทธ(<menu>
)๋ก ํด์๋จ. ๋ด์ฅ HTML ์์ ๋๋:<Tabs buttonsContainer={Section} />
- ์ปค์คํ
์ปดํฌ๋ํธ
Section
์ ์ ๋ฌํจ. ์ปค์คํ ์ปดํฌ๋ํธ
Tabs ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๋ฐ์ ๊ฐ์ JSX ํ๊ทธ๋ก ์ฌ์ฉํ๊ธฐ
function Tabs({ buttonsContainer }) {
const ButtonsContainer = buttonsContainer; // ์ค์: ๋๋ฌธ์๋ก ์์
return (
<ButtonsContainer>
{/* ๋ฒํผ๋ค */}
</ButtonsContainer>
);
}
- ๋ฆฌ์กํธ๋ ๋๋ฌธ์๋ก ์์ํ๋ JSX ํ๊ทธ๋ฅผ ์ปค์คํ ์ปดํฌ๋ํธ๋ก ์ธ์ํจ
- ์ ๋ฌ๋ฐ์
buttonsContainer
๊ฐ์ ๋ฐ๋ผ HTML ํ๊ทธ๋ ์ปดํฌ๋ํธ๋ฅผ ๋์ ์ผ๋ก ์์ฑ ๊ฐ๋ฅ
๋ด์ฅ HTML ํ๊ทธ๋ ๋ฌธ์์ด๋ก ์ ๋ฌ, ์ปค์คํ
์ปดํฌ๋ํธ๋ ํจ์ ์ฐธ์กฐ๋ก ์ ๋ฌ - buttonsContainer="menu"
โ <menu>
๋ก ๋ ๋๋ง - buttonsContainer={Section}
โ <Section>
์ผ๋ก ๋ ๋๋ง
์ด๋ฏธ์ง ์ ์ฅ์๋ public/ VS assets/
public/
ํด๋ ์ฌ์ฉ ์์ - HTML์์ ์ง์ ์ฐธ์กฐํด์ผ ํ๋ ์ด๋ฏธ์ง
- ์ธ๋ถ์์ URL๋ก ์ง์ ์ ๊ทผ์ด ํ์ํ ๋ฆฌ์์ค
- ๋น๋์ ๋ฌด๊ดํ๊ฒ ์ ์ ์ ์ง๋ผ์ผ ํ ํ์ผ
src/assets/
ํด๋ ์ฌ์ฉ ์์ - ์ปดํฌ๋ํธ์์
import
ํ์ฌ ์ฌ์ฉํ๋ ์ด๋ฏธ์ง - ๋ฆฌ์กํธ ์ฑ์ ๊ตฌ์ฑ์์์ ํจ๊ป ๋ฒ๋ค๋ง๋์ด์ผ ํ ๋ฆฌ์์ค
- ๋น๋ ๊ณผ์ ์์ ์ต์ ํ๊ฐ ํ์ํ ๋ฆฌ์์ค
- ์ปดํฌ๋ํธ์์
๐ Reference
- ใํ๊ธ์๋งใ React ์๋ฒฝ ๊ฐ์ด๋ 2025 with React Router & Redux | Udemy
- ์ด๋ฏธ์ง ์ถ์ Freepik | ์ฌ์ธ์ AI ํฌ๋ฆฌ์์ดํฐ๋ธ ํด