[React] Blog ์˜ˆ์ œ

์ด๋‹ค์˜ยท2024๋…„ 6์›” 23์ผ

React

๋ชฉ๋ก ๋ณด๊ธฐ
8/31

๐Ÿ“Œ Blog1 ๊ธฐ๋Šฅ ์„ค๋ช…

  1. ๐Ÿ’š ํด๋ฆญ ์‹œ ์ˆซ์ž 1์”ฉ ์ฆ๊ฐ€
  2. ๊ธ€ ์ˆ˜์ • ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋‚จ์ž์ฝ”ํŠธ ์ถ”์ฒœ ์ผ ๋•Œ ์—ฌ์ž์ฝ”ํŠธ ์ถ”์ฒœ์œผ๋กœ, ์—ฌ์ž์ฝ”ํŠธ ์ถ”์ฒœ ์ผ ๋•Œ๋Š” ๋‚จ์ž์ฝ”ํŠธ ์ถ”์ฒœ์œผ๋กœ ๊ธ€ ์ˆ˜์ •
  3. ๋ชจ๋‹ฌ์ฐฝ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋ชจ๋‹ฌํ™”๋ฉด show/hide

์ „์ฒด์ฝ”๋“œ

import { useState } from "react";
import "./App.css";

const Modal = () => {
  return (
    <div className="modal">
      <h4>์ œ๋ชฉ</h4>
      <p>๋‚ ์งœ</p>
      <p>์ƒ์„ธ๋‚ด์šฉ</p>
    </div>
  );
};

function App() {
  //array/object๋‹ค๋ฃฐ ๋•Œ ์›๋ณธ ๋ณด์กดํ•˜๋Š” ๊ฒŒ ์ข‹์Œ
  const [lists, setLists] = useState([
    "๋‚จ์ž์ฝ”ํŠธ ์ถ”์ฒœ",
    "๊ฐ•๋‚จ ์šฐ๋™ ๋ง›์ง‘",
    "๋ฆฌ์•กํŠธ ๊ณต๋ถ€",
  ]);
  const [count, setCount] = useState(0); //๐Ÿ’š ํด๋ฆญ ์‹œ ์ˆซ์ž ์ฆ๊ฐ€
  const [modal, setModal] = useState("false"); // ๋ฆฌ์•กํŠธ ๊ณต๋ถ€ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋ชจ๋‹ฌ์ฐฝ show/hide

  return (
    <div className="App">
      <div className="black-nav">
        <h4>React Blog</h4>
      </div>

      <div className="list">
        <h4>
          {lists[0]} <span onClick={() => setCount(count + 1)}>๐Ÿ’š</span> {count}
        </h4>

        <button
          onClick={() => {
            const newList = [...lists]; //๋ฐฐ์—ด ๋‚ด [๋Œ€๊ด„ํ˜ธ]๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๊ฐ’์„ ๋ณด์—ฌ์คŒ
            newList[0] =
              lists[0] === "๋‚จ์ž์ฝ”ํŠธ ์ถ”์ฒœ" ? "์—ฌ์ž์ฝ”ํŠธ ์ถ”์ฒœ" : "๋‚จ์ž์ฝ”ํŠธ ์ถ”์ฒœ";
            setLists(newList);
          }}
        >
          ๊ธ€ ์ˆ˜์ •
        </button>
        <p>6์›” 21์ผ ๋ฐœํ–‰</p>
      </div>

      <div className="list">
        <h4>{lists[1]}</h4>
        <p>6์›” 21์ผ ๋ฐœํ–‰</p>
      </div>

      <div className="list">
        <h4>{lists[2]}</h4>
        <p>6์›” 21์ผ ๋ฐœํ–‰</p>
      </div>

      <div className="list">
        <button
          onClick={() => {
            setModal(!modal); //true๋ฉด false, false๋ฉด true
          }}
        >
          ๋ชจ๋‹ฌ์ฐฝ
        </button>
        {modal === true ? <Modal /> : null}
      </div>
    </div>
  );
}

export default App;

๐Ÿ“Œ <Blog1 ํ’€์ด>

โœ”๏ธ Array Object ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ์›๋ณธ์„ ๋ณด์กดํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค

<button
   onClick={() => {
     const newList = [...lists]; //์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์›๋ณธ์„ ๋ณด์กด
     newList[0] = //newList๋ณ€์ˆ˜์— ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด์„œ ํด๋ฆญ ์‹œ ๊ธ€์ž ๋ฐ”๋€Œ๋Š” ๊ธฐ๋Šฅ์„ ๋„ฃ์–ด์คŒ
     lists[0] === "๋‚จ์ž์ฝ”ํŠธ ์ถ”์ฒœ" ? "์—ฌ์ž์ฝ”ํŠธ ์ถ”์ฒœ" : "๋‚จ์ž์ฝ”ํŠธ ์ถ”์ฒœ";
     setLists(newList); // ์ƒํƒœ๋ณ€ํ™”ํ•จ์ˆ˜ ์ธ์ˆ˜์— ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด์คŒ
   }}
>
  ๊ธ€ ์ˆ˜์ •
</button>
<p>6์›” 21์ผ ๋ฐœํ–‰</p>
</div>

โœ”๏ธ state ๋ณ€๊ฒฝํ•จ์ˆ˜ ํŠน์ง•

  • ์ƒํƒœ๋ณ€ํ™”ํ•จ์ˆ˜() ๊ด„ํ˜ธ์•ˆ์— ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ๋‹ค
  • ๊ธฐ์กด state === ์‹ ๊ทœ state์˜ ๊ฒฝ์šฐ, ์ฆ‰ ๊ฐ™์„ ๊ฒฝ์šฐ state ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค

โœ”๏ธ setModal(true), setModal(!modal)์˜ ์ฐจ์ด
์ฒ˜์Œ์—๋Š” state modal์˜ ์ดˆ๊ธฐ๊ฐ’์ด false ์—ฌ์„œ setModal(true)์™€ setModal(!modal) !๋ฅผ ๋ถ™์ด๊ฒŒ ๋˜๋ฉด true๋กœ ๋ณ€ํ•˜๊ฒŒ ๋˜๋‹ˆ๊นŒ ๊ฐ™์€ ์˜๋ฏธ์ธ ์ค„ ์•Œ์•˜๋‹ค
setModal(true) ์ด๋ ‡๊ฒŒ ์“ฐ๊ฒŒ ๋˜๋ฉด true๋กœ ๊ณ ์ •์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— false๋กœ ๋ณ€ํ•  ์ˆ˜ ์—†๊ณ , ๋ชจ๋‹ฌ์ฐฝ์€ ์—ด๋ฆฌ๋Š” ๊ธฐ๋Šฅ๋งŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค ๋‹ซํžˆ๋Š” ๊ธฐ๋Šฅ์ด ๋˜์ง€ ์•Š์•˜๊ธฐ์— ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค ... ! ์˜๋ฏธ๋ฅผ ์ž˜ ์•Œ์•„๋ณด๋ฉด true ์ผ ๋•Œ๋Š” false๋กœ, false์ผ ๋•Œ๋Š” true๋กœ ๋ณ€ํ™˜์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— setModal(!modal) ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ์—ด๋ฆฌ๊ณ  ๋‹ซํžˆ๋Š” ๊ธฐ๋Šฅ์ด ์ž˜ ๋œ๋‹ค !

!์˜ ์˜๋ฏธ๋ฅผ ์žŠ์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ๋งํ•ด๋ณด์ž๋ฉด ,,
!true ์ผ ๋•Œ false
!false ์ผ ๋•Œ true
๋งŒ์•ฝ์— !!true ์ด ์ฝ”๋“œ์ฒ˜๋Ÿผ !! ๋‘๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” false๊ฐ€ ๋๋‹ค๊ฐ€ ๋‹ค์‹œ true๋กœ ๋˜๊ธฐ ๋•Œ๋ฌธ์— true๊ฐ€ ๋œ๋‹ค

๐Ÿ“Œ Blog2 ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ map ์‚ฌ์šฉ ๋ฐ ๊ธฐ๋Šฅ ์„ค๋ช…

  1. ๐Ÿ’š ํด๋ฆญ ์‹œ ์ˆซ์ž 1์”ฉ ์ฆ๊ฐ€๋˜๋‚˜ ๊ฐ๊ฐ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ฆ๊ฐ€
      {lists.map((list, i) => {
        return (
          <div className="list" key={i}>
            <h4>
              {lists[i]}
              <span
                onClick={() => {
                  let copy = [...count];
                  copy[i] = count[i] + 1;
                  setCount(copy);
                }}
              >
                ๐Ÿ’š
              </span>
              {count[i]}
            </h4>
            <p>6์›” 21์ผ ๋ฐœํ–‰</p>
          </div>
        );
      })}
    </div>

๐Ÿ“Œ <Blog2 ํ’€์ด>

โœ”๏ธ map ํŠน์ง•

  • ์ค‘๊ด„ํ˜ธ ๋‚ด๋ถ€์—์„œ๋Š” for๋ฌธ, ์กฐ๊ฑด๋ฌธ๋“ฑ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค
  • array ์ž๋ฃŒ ๊ฐœ์ˆ˜๋งŒํผ ํ•จ์ˆ˜ ์•ˆ์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค
  • ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” array ์•ˆ์— ์žˆ๋˜ ๋ฐ์ดํ„ฐ๋“ค์€ ๋ณด์—ฌ์ค€๋‹ค
  • return ๋’ค์— ์ ์–ด์ฃผ๋Š” ์ฝ”๋“œ๋“ค์€ ๋ฐฐ์—ด์˜ ์ž๋ฃŒ๋กœ ๋‹ด์•„์ค€๋‹ค

โœ”๏ธ lists์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ฒซ๋ฒˆ์งธ๋Š” ๋ฐฐ์—ด์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋œปํ•˜๊ณ , ๋‘๋ฒˆ์งธ๋Š” ๋ฐ˜๋ณต๋ฌธ ๋Œ ๋•Œ๋งˆ๋‹ค 0๋ถ€ํ„ฐ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ์ •์ˆ˜๋ฅผ ๋œปํ•œ๋‹ค

{lists[0]}
{lists[1]}
{lists[1]} // ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ถˆ๋Ÿฌ์ฃผ๋Š” ๊ฒƒ ๋ณด๋‹ค

{lists[i]} // ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ค€ ์ •์ˆ˜๋กœ ํ‘œํ˜„ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ถ•์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค

โœ”๏ธ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ html์„ ์ƒ์„ฑ ํ•  ๊ฒฝ์šฐ์—๋Š” key๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค

<div className="list" key={i}> //๋ฐ˜๋ณต ์ƒ์„ฑํ•œ UI๋งˆ๋‹ค ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค๋ฅธ ํ‚ค๊ฐ’์œผ๋กœ ์ ์–ด์ค˜์•ผ ํ•œ๋‹ค(๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ณ , ์ˆซ์ž๋กœ ์ ์–ด์ค˜๋„ ๋œ๋‹ค)

์ถœ์ฒ˜

์ฝ”๋”ฉ์• ํ”Œ ๋ฆฌ์•กํŠธ

0๊ฐœ์˜ ๋Œ“๊ธ€