๐ญ ์๋ก
๋ฆฌ์กํธ๋ก ์ฌ๋ฌ๊ฐ์ ๋ฒํผ ์ค ํด๋ฆญํ๋ฉด ํ๋์ ๋ฒํผ์๋ง active ํด๋์ค๋ฅผ ์ถ๊ฐํด์ฃผ๋ ์ด๋ฒคํธ๋ฅผ ๊ตฌํํ๋ฉด์ ๊ฐ์๊ธฐ ํท๊ฐ๋ ธ๋ ๊ฒฝํ์ด ์๋ค.
๊ฐ๋จํ๋ฐ ๋ฐ๋๋ผ JS์์ ๋ฆฌ์กํธ๋ก ๋ฐ๋์์ ๋ฟ์ธ๋ฐ ํท๊ฐ๋ฆฌ๋๋ผ.
ํด๋ฆญ ์ด๋ฒคํธ๋ก active ํด๋์ค๋ฅผ ์ ์ดํ๋ ๋ฐฉ์์ ๊ธฐ์ค์ผ๋ก ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฆฌ์กํธ์ ํต์ฌ ์ฐจ์ด๋ฅผ ์ ๋ฆฌํด๋ณด์๋ค.
โ ๋ฐ๋๋ผ JavaScript ๋ฐฉ์
๋ฐ๋๋ผ JS์์๋ DOM์ ์ง์ ์ ํํ๊ณ ํด๋์ค๋ฅผ ์ง์ ์ถ๊ฐ/์ ๊ฑฐํ๋ค.
const tabs = document.querySelectorAll(".tab");
tabs.forEach((tab) => {
tab.addEventListener("click", () => {
tabs.forEach((t) => t.classList.remove("active"));
tab.classList.add("active");
});
});
1. querySelector๋ก DOM์ ์ง์ ๊ฐ์ ธ์จ๋ค
2. addEventListener๋ก ์ด๋ฒคํธ๋ฅผ ๊ฑด๋ค
3. classList.add/remove๋ก ์ง์ ํด๋์ค ์กฐ์ํ๋ค
๐ ๋ชจ๋ ๊ฑธ ์ง์ ์ ์ดํ๋ “๋ช ๋ นํ ๋ฐฉ์”
โ React ๋ฐฉ์
React์์๋ DOM์ ์ง์ ๊ฑด๋๋ฆฌ์ง ์๋๋ค.
state๋ฅผ ๋ณ๊ฒฝํ๊ณ UI๋ ๊ทธ ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ ๋ฐ์๋๋ค.
import { useState } from "react";
function Tabs() {
const [active, setActive] = useState("home");
const tabs = ["home", "about", "contact"];
return (
<div>
{tabs.map((tab) => (
<button
key={tab}
className={active === tab ? "active" : ""}
onClick={() => setActive(tab)}
>
{tab}
</button>
))}
</div>
);
}
1. ํด๋ฆญ ์ setState๋ก ์ํ ๋ณ๊ฒฝ
2. active === tab ์กฐ๊ฑด์ผ๋ก ํด๋์ค ์ ์ฉ
3. DOM ์กฐ์ ์์ด ์๋ ๋ ๋๋ง
๐ ์ํ ์ค์ฌ์ “์ ์ธํ ๋ฐฉ์”
๐ฅ ์์ - ๋ฒํผ 3๊ฐ ์ค ํ๋๋ง active
โ ๋ฐ๋๋ผ JavaScript
<button class="tab">home</button>
<button class="tab">about</button>
<button class="tab">contact</button>
const tabs = document.querySelectorAll(".tab");
tabs.forEach((tab) => {
tab.addEventListener("click", () => {
// ๋ชจ๋ ๋ฒํผ์์ active ์ ๊ฑฐ
tabs.forEach((t) => t.classList.remove("active"));
// ํด๋ฆญํ ๋ฒํผ์๋ง active ์ถ๊ฐ
tab.classList.add("active");
});
});
ํด๋ฆญํ ๋๋ง๋ค “์ ์ฒด ์ด๊ธฐํ → ์ ํ๋ ๊ฒ๋ง ์ ์ฉ” ํ๋ฆ์ผ๋ก ์ง์ ์ฒ๋ฆฌํ๋ค.
โ React
import { useState } from "react";
function Tabs() {
const [active, setActive] = useState("home");
return (
<div>
<button
className={active === "home" ? "active" : ""}
onClick={() => setActive("home")}
>
home
</button>
<button
className={active === "about" ? "active" : ""}
onClick={() => setActive("about")}
>
about
</button>
<button
className={active === "contact" ? "active" : ""}
onClick={() => setActive("contact")}
>
contact
</button>
</div>
);
}
ํ์ฌ ์ ํ๋ ๊ฐ(active) ํ๋๋ง ๊ด๋ฆฌํ๋ฉด ๋๋จธ์ง๋ ์๋์ผ๋ก ์ ๋ฆฌ๋๋ค.
๐ฅ ํต์ฌ ์ฐจ์ด ํ๋์ ๋ณด๊ธฐ
| ๊ตฌ๋ถ | ๋ฐ๋๋ผ JavaScript | React |
| DOM ์กฐ์ | ์ง์ | ์ง์ X |
| ์ํ ๊ด๋ฆฌ | ์์ (์ง์ ์ฒ๋ฆฌ) | state๋ก ๊ด๋ฆฌ |
| ํด๋์ค ๋ณ๊ฒฝ | classList ์ฌ์ฉ | className ์กฐ๊ฑด ์ฒ๋ฆฌ |
๐ง ์ฌ๊ณ ๋ฐฉ์ ์ฐจ์ด
์ด ๋์ ์ฐจ์ด๋ ๋จ์ํ ๋ฌธ๋ฒ์ด ์๋๋ผ ์๊ฐํ๋ ๋ฐฉ์ ์์ฒด๊ฐ ๋ค๋ฅด๋ค.
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋
“ํด๋ฆญ๋๋ค?
→ ๋ค๋ฅธ ์ ๋ค ํด๋์ค ์ ๊ฑฐํ๊ณ
→ ์ด ๋ฒํผ์ active ๋ถ์ด์”
์ด ๊ณผ์ ์ ํ๋์ฉ ์ง์ ์คํํ๋ค.
๋ฐ๋ฉด ๋ฆฌ์กํธ๋
“ํ์ฌ ์ ํ๋ ๊ฐ์ ์ด๊ฑฐ๋ค
→ ๊ทธ ๊ฐ๊ณผ ๊ฐ์ ๋ฒํผ๋ง active๋ค”
๊ฒฐ๊ณผ ์ํ๋ง ์ ์ํ๋ฉด UI๊ฐ ๋ฐ๋ผ์จ๋ค.
๐ง ํ ์ค ์ ๋ฆฌ
- ๋ฐ๋๋ผ: “ํด๋์ค๋ฅผ ์ง์ ๋ฐ๊พผ๋ค”
- React: “์ํ๋ฅผ ๋ฐ๊พธ๋ฉด UI๊ฐ ๋ฐ๋ผ์จ๋ค”
๐ ๋ง๋ฌด๋ฆฌ
์ฒ์์๋ React ๋ฐฉ์์ด ๋ ์ด๋ ต๊ฒ ๋๊ปด์ง๋๋ฐ ๋ฆฌ์กํธ ๋ฐฉ์์ ์ต์ํด์ ธ ์ํ ๊ธฐ๋ฐ์ผ๋ก ์๊ฐํ๊ธฐ ์์ํ๋ฉด ์ฝ๋๊ฐ ํจ์ฌ ๋จ์ํด์ง๋ค.
ํนํ ํญ, ๋ฉ๋ด, ํํฐ UI ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ ํ๋ ๊ฐ ํ๋๋ง ๊ด๋ฆฌํ๋ค๋ ํจํด๋ง ๊ธฐ์ตํด๋ ๋๋ถ๋ถ ์ด๋ ค์์ด ํด๊ฒฐ๋ ๊ฒ ๊ฐ๋ค!

'FE > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๊ธฐ์กด Vite + React ํ๋ก์ ํธ์ TypeScript ์ถ๊ฐํ๊ธฐ (๋ง์ด๊ทธ๋ ์ด์ ์ ๋ฆฌ) (0) | 2026.03.12 |
|---|---|
| "๋ฆฌ์กํธ๋ ๊ฐ์ DOM์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค." ๊ฐ ๋ฌด์จ ๋ง์ด์ผ? (0) | 2023.09.13 |
| ๋ฆฌ์กํธ ์ฐ๋จน 3 - Component ์ปดํฌ๋ํธ (1) | 2023.04.21 |
| ๋ฆฌ์กํธ ์ฐ๋จน 2 (1) | 2023.04.14 |
| ๋ฆฌ์กํธ ์ฐ๋จน 1 (1) | 2023.04.13 |
๋๊ธ