๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
FE/React

ํด๋ฆญ ์ด๋ฒคํŠธ๋กœ ์•Œ์•„๋ณด๋Š” React vs ๋ฐ”๋‹๋ผ JavaScript ํ•ต์‹ฌ ์ฐจ์ด

by vellahw 2023. 5. 9.

๐Ÿ’ญ ์„œ๋ก 

๋ฆฌ์•กํŠธ๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฒ„ํŠผ ์ค‘ ํด๋ฆญํ•˜๋ฉด ํ•˜๋‚˜์˜ ๋ฒ„ํŠผ์—๋งŒ 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 ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์„ ํƒ๋œ ๊ฐ’ ํ•˜๋‚˜๋งŒ ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ํŒจํ„ด๋งŒ ๊ธฐ์–ตํ•ด๋„ ๋Œ€๋ถ€๋ถ„ ์–ด๋ ค์›€์ด ํ•ด๊ฒฐ๋  ๊ฒƒ ๊ฐ™๋‹ค!

 

๋Œ“๊ธ€