[React] ๐Ÿ“– State์™€ Props

์–ธ์ง€ยท2024๋…„ 12์›” 2์ผ

React

๋ชฉ๋ก ๋ณด๊ธฐ
8/13
post-thumbnail

๐Ÿ“ State์™€ Props ๋ž€?

State๋ž€?
Props๋ž€?


๐Ÿ“ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ 

1๏ธโƒฃ ์ž์‹ ์ด ๊ด€๋ฆฌํ•˜๋Š” state์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ
2๏ธโƒฃ ์ œ๊ณต๋ฐ›๋Š” props์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ
3๏ธโƒฃ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋ฉด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง


๐Ÿ“ state์™€ props

์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ• - ์ „๊ตฌ ์—ญํ• ์„ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ

const Bulb = ({light}) => {
  return(
    <div>{light === "ON" ? (
      <h1 style={{backgroundColor:"orange"}}>ON</h1>
      ) : (
      <h1 style={{backgroundColor:"gray"}}>OFF</h1>
      )}
    </div>
   ) 
};
return (
	const [light, setLight] = useState("OFF");
    <>
      <Bulb />
      <button
        onClick={() => {
          setLight(light === "ON" ? "OFF" : "ON");
        }}
      >
        Click
      </button>
    </>
  );
  • ๋ถ€๋ชจ ์ปดํฌ๋„ˆํŠธ๊ฐ€ Bulb light์— Props๋ฅผ ์ „๋‹ฌ
  • ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ light props๋ฅผ ์‚ฌ์šฉํ•ด ์ „๊ตฌ ์ƒํƒœ ํ‘œ์‹œ

โ—๏ธ ๋ฌธ์ œ๋ฐœ์ƒ

count์— ์žˆ๋Š” ๋ฒ„ํŠผ์„ Clickํ•˜๋ฉด count ๋ฆฌ๋ Œ๋”๋ง๋˜๊ณ  Bulb ์ปดํฌ๋„ŒํŠธ๋„ ๋ฆฌ๋ Œ๋”๋ง์ด ๋œ๋‹ค.
3๏ธโƒฃ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋ฉด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง

count์˜ state๊ฐ€ ๋ถ€๋ชจ(App) ์•ˆ์— ์žˆ์–ด ๋ฒ„ํŠผ์„ Clickํ•˜๋ฉด App์ด ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜์–ด App์˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์ธ Bulb ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฆฌ๋ Œ๋”๋ง์ด ๋œ๋‹ค.

const Bulb = ({light}) => {
  return(
    <div>{light === "ON" ? (
      <h1 style={{backgroundColor:"orange"}}>ON</h1>
      ) : (
      <h1 style={{backgroundColor:"gray"}}>OFF</h1>
      )}
    </div>
  ) 
};

function App() {
  const [count, setCount] = useState(0);
  const [light, setLight] = useState("OFF");
  return (
    <>
      <h1>{count}</h1>
      <button onClick={() => {
        setCount(count + 1);
      }}>
        Click
      </button>

      
      <Bulb light={light}/>
      <button
        onClick={() => {
          setLight(light === "ON" ? "OFF" : "ON");
        }}
      >
        Click
      </button>
    </>
  );
}

export default App;
  • ํ˜„์žฌ ์ „๊ตฌ state์™€ ์ˆซ์ž ์„ธ๋Š” state๊ฐ€ ํ•˜๋‚˜๋งŒ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋„ ๋™์‹œ์— ๋ฆฌ๋ Œ๋”๋ง์ด ๋จ
    โžก๏ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• : ์ „๊ตฌ state์™€ ์ˆซ์ž ์„ธ๋Š” state๋ฅผ ์ปดํผ๋„ŒํŠธ๋กœ ๋‚˜๋ˆˆ๋‹ค.

๐Ÿ†— ๋ฌธ์ œํ•ด๊ฒฐ

// ์ „๊ตฌ state
const Bulb = () => {
  const [light, setLight] = useState("OFF");
  return(
    <div>{light === "ON" ? (
      <h1 style={{backgroundColor:"orange"}}>ON</h1>
      ) : (
      <h1 style={{backgroundColor:"gray"}}>OFF</h1>
      )}

      <button
        onClick={() => {
          setLight(light === "ON" ? "OFF" : "ON");
        }}
      >
        Click
      </button>
    </div>
  ) 
};

// ์ˆซ์ž ์„ธ๋Š” state
const Counter = () => {
  const [count, setCount] = useState(0);

  return(
    <div>
      <h1>{count}</h1>
      <button onClick={() => {ใ…‹
        setCount(count + 1);
      }}>
        Click
      </button>
    </div>
  )
};
  
return (
  <>
    <Bulb />
    <Counter />
  </>
);
  • Bulb ์ปดํฌ๋„ŒํŠธ๋Š” state๋ฅผ ์ปดํฌ๋„ŒํŠธ ์•ˆ์— ์„ ์–ธํ•˜๋ฉด ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ props๋ฅผ ๋ฐ›์ง€์•Š์•„๋„๋œ๋‹ค.

โ“ ๊ทผ๋ฐ ์™œ ์ „ํ˜€ ์ƒ๊ด€์—†๋Š” ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋ฉด ์•ˆ๋ผ์š”?
: ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋‚˜ props๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ ์ „ํ˜€ ์ƒ๊ด€์—†๋Š” ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์ƒํƒœ ๊ณ„์‚ฐ๊ณผ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋˜๊ณ  ์ด๋กœ์ธํ•ด ์„ฑ๋Šฅ์ด ์ €ํ•˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด App์— ์„ ์–ธํ•˜๊ธฐ

  • ์ปดํฌ๋„ŒํŠธ ํด๋”์— Bulb.jsx, Counter.jsx ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

Bulb.jsx

import { useState } from "react";

const Bulb = () => {
    const [light, setLight] = useState("OFF");
    return(
      <div>{light === "ON" ? (
        <h1 style={{backgroundColor:"orange"}}>ON</h1>
        ) : (
        <h1 style={{backgroundColor:"gray"}}>OFF</h1>
        )}
  
        <button
          onClick={() => {
            setLight(light === "ON" ? "OFF" : "ON");
          }}
        >
          Click
        </button>
      </div>
    ) 
  };

export default Bulb;

Counter.jsx

import { useState } from "react";

const Counter = () => {
    const [count, setCount] = useState(0);
  
    return(
      <div>
        <h1>{count}</h1>
        <button onClick={() => {
          setCount(count + 1);
        }}>
          Click
        </button>
      </div>
    )
  };

export default Counter;

App.jsx

: ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ์„ App.jsx ์—์„œ ์„ ์–ธํ•˜์—ฌ return ์•ˆ์— ํƒœ๊ทธ์ฒ˜๋Ÿผ ์‚ฌ์šฉ

import "./App.css";
import Bulb from "./components/Bulb";
import Counter from "./components/Counter";

function App() {
  
  return (
    <>
      <Bulb />
      <Counter />
    </>
  );
}

export default App;

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