roqkf

[React] React State & Props ๋ณธ๋ฌธ

๐Ÿ’ป Development/React

[React] React State & Props

ahyeon7 2022. 11. 30. 01:59

[Props์™€ State]

Props

: ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’

State

: ๋‚ด๋ถ€์—์„œ ๋ณ€ํ™”ํ•˜๋Š” ๊ฐ’
: ์‚ด๋ฉด์„œ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’
: ์ปดํฌ๋„ŒํŠธ์˜ ์‚ฌ์šฉ ์ค‘ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’

[State์™€ Props ๊ตฌ๋ณ„ํ•ด ๋ณด๊ธฐ!]

์ด๋ฆ„: Props
์„ฑ๋ณ„: Props
๋‚˜์ด: State
ํ˜„์žฌ ์‚ฌ๋Š” ๊ณณ: State
์ทจ์—… ์—ฌ๋ถ€: State
๊ฒฐํ˜ผ/์—ฐ์•  ์—ฌ๋ถ€: State

Props

๐Ÿ”น Props์˜ ํŠน์ง•

  • ์ปดํฌ๋„ŒํŠธ์˜ ์†์„ฑ(property)์„ ์˜๋ฏธ
์„ฑ๋ณ„์ด๋‚˜ ์ด๋ฆ„์ฒ˜๋Ÿผ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง„ ์†์„ฑ์— ํ•ด๋‹น
  • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ(์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ)๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’
React ์ปดํฌ๋„ŒํŠธ๋Š” JS ํ•จ์ˆ˜์™€ ํด๋ž˜์Šค๋กœ, Props๋ฅผ ํ•จ์ˆ˜์˜ ์ „๋‹ฌ์ธ์ž์ฒ˜๋Ÿผ ์ „๋‹ฌ๋ฐ›์•„์„œ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ
ํ™”๋ฉด์— ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋˜๋Š”์ง€๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” React ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
์ฆ‰, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ตœ์ดˆ ๋ Œ๋”๋ง ๋  ๋•Œ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๊ณ ์žํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ์ฒด ํ˜•ํƒœ
Props๋กœ ์–ด๋–ค ํƒ€์ž…์˜ ๊ฐ’๋„ ๋„ฃ์–ด ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ Props๋Š” ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค.
  • Props๋Š” ์ฝ๊ธฐ ์ „์šฉ
์„ฑ๋ณ„์ด๋‚˜ ์ด๋ฆ„๊ณผ ๊ฐ™์ด ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์•„์„œ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์ด๋‹ค. 
๊ทธ๋ž˜์„œ Props๋Š” ํ•จ๋ถ€๋กœ ๋ณ€๊ฒฝ์ด ๋  ์ˆ˜ ์—†๋Š” ์ฝ๊ธฐ ์ „์šฉ ๊ฐ์ฒด์ด๋‹ค.

์ฝ๊ธฐ ์ „์šฉ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด Props๋ฅผ ์ „๋‹ฌ๋ฐ›์€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ Props๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜๊ฒŒ ๋  ๋•Œ,
Props๋ฅผ ์ „๋‹ฌํ•œ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ’์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
์ฆ‰, ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์•„ side effect๊ฐ€ ์ƒ๊ธฐ๊ณ  ์ด๋Š” React์˜ ๋‹จ๋ฐ˜ํ–ฅ, ํ•˜ํ–ฅ์‹ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์›์น™์— ์œ„๋ฐฐ๋œ๋‹ค.

๐Ÿ”น Props ์‚ฌ์šฉ๋ฒ•

  1. ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๊ณ ์žํ•˜๋Š” ๊ฐ’๊ณผ ์†์„ฑ์„ ์ •์˜
  2. props๋ฅผ ์ด์šฉํ•ด ์ •์˜๋œ ๊ฐ’๊ณผ ์†์„ฑ ์ „๋‹ฌ
  3. ์ „๋‹ฌ๋ฐ›์€ props ๋ Œ๋”๋ง
function Parent() {
  // Parent ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ
  return (
    <div className="parent">
      <h1>I'm the parent</h1>
      {/* HTML ์†์„ฑ๊ณผ ๊ฐ’ ๋‹ค๋ฃจ๋Š” ๋ฒ•,  <a> ์š”์†Œ์˜ href ์†์„ฑ์— ๋„ค์ด๋ฒ„ ๋งํฌ ๊ฐ’์„ ์คŒ */}
      <a href="https://www.naver.com/">Click me to visit Naver</a>
      {/* React์—์„œ JSX ์†์„ฑ ๋ฐ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ• : <Child attribute={value} /> */}
      <Child text={"I'm the eldest child"} />
      <Child />
    </div>
  );
}

// Child ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ
function Child(props) {
  return (
    <div className="child">
      <p>{props.tect}</p>
    </div>
  );
}
// props๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•: ์—ฌ๋Š” ํƒœ๊ทธ์™€ ๋‹ซ๋Š” ํƒœ๊ทธ ์‚ฌ์ด์— value๋ฅผ ๋„ฃ์–ด์„œ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•
// ์ด์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์— props.children์„ ์ด์šฉํ•˜์—ฌ value์— ์ ‘๊ทผํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค 


function Parent() {
  return (
    <div className="parent">
        <h1>I'm the parent</h1>
        <Child>I'm the eldest child</Child>
    </div>
  );
};

function Child(props) {
  return (
    <div className="child">
        <p>{props.children}</p>
    </div>
  );
};

Action item

  • App ์ปดํฌ๋„ŒํŠธ์— ์žˆ๋Š” itemOne๊ณผ itemTwo๋ฅผ Learn ์ปดํฌ๋„ŒํŠธ์— props๋กœ ์ „๋‹ฌํ•˜์—ฌ, "React๋ฅผ ๋ฐฐ์šฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋ฌธ์ž์—ด์ด rendering ๋˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์™„์„ฑํ•˜๊ธฐ


State

  • state๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด๋‹ค. ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋ฌด์—‡์„ ์ƒํƒœ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

ex) ์‡ผํ•‘๋ชฐ ์žฅ๋ฐ”๊ตฌ๋‹ˆ
์†Œ๋น„์ž๊ฐ€ ๊ตฌ๋งคํ•  ๋ฌผ๊ฑด๊ณผ ๋‹น์žฅ ๊ตฌ๋งคํ•˜์ง€ ์•Š์„ ๋ฌผ๊ฑด์„ ์ฒดํฌ๋ฐ•์Šค์— ์ฒดํฌํ•˜์—ฌ ๊ตฌ๋ถ„ ์ง“๋Š”๋‹ค.
์ด๋ฅผ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‚ด์—์„œ ์ƒํƒœ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค๋ฉด "check๋œ ์ƒํƒœ"์™€ "check ๋˜์ง€ ์•Š์€ ์ƒํƒœ"์ด๋‹ค.
์ฒดํฌ๋œ ์ƒํƒœ์™€ ์ฒดํฌ๋˜์ง€ ์•Š์€ ์ƒํƒœ์™€ ๊ฐ™์ด ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’(์ƒํƒœ)๋Š” React state๋กœ ๋‹ค๋ค„์•ผ ํ•œ๋‹ค.

๐Ÿ”น useState ์‚ฌ์šฉ๋ฒ•

  1. useState ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
  • React์—์„œ๋Š” state๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ useState ํ•จ์ˆ˜๋ฅผ ์ œ๊ณต, ์ด๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ React๋กœ๋ถ€ํ„ฐ useState๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•œ๋‹ค. import ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด useState ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
import { useState } from "react";
  1. useState ํ˜ธ์ถœํ•˜๊ธฐ
  • useState๋ฅผ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ๊ฒƒ์€ "state" ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์œผ๋ฉฐ, ๋ณ€์ˆ˜๋ช…์€ ์ง“๊ณ  ์‹ถ์€ ๋ณ€์ˆ˜๋ช…์œผ๋กœ ์ง€์–ด๋„ ๋œ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋ณ€์ˆ˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ๋๋‚  ๋•Œ ์‚ฌ๋ผ์ง€์ง€๋งŒ, state ๋ณ€์ˆ˜๋Š” React์— ์˜ํ•ด์„œ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค.
function CheckboxExample() {
  // ์ƒˆ๋กœ์šด state ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , isChecked ๋ผ ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
  // 1๋ฒˆ ์ฝ”๋“œ๋ฅผ ํ’€์–ด์“ฐ๋ฉด
  const [isChecked, setIsChecked] = useState(false); // 1๋ฒˆ
  
  // isChecked: state๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜
  // setIsChecked: state isChecked๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜
  // useState : state hook
  // false: state ์ดˆ๊นƒ๊ฐ’
  
  //...

  // 2๋ฒˆ ์ฝ”๋“œ์™€ ๊ฐ™๋‹ค.
  const stateHookArray = useState(false); // 2๋ฒˆ
  const isChecked = stateHookArray[0];
  const setIsChecked = stateHookArray[1];
  • useState๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด ๋ฐฐ์—ด์˜ 0๋ฒˆ์งธ ์š”์†Œ๋Š” ํ˜„์žฌ state ๋ณ€์ˆ˜์ด๊ณ , 1๋ฒˆ์งธ ์š”์†Œ๋Š” ์ด ๋ณ€์†Œ๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค. useState์˜ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฐ’์€ state์˜ ์ดˆ๊ธฐ๊ฐ’์ด๋‹ค.
const [state ์ €์žฅ๋ณ€์ˆ˜, state ๊ฐฑ์‹  ํ•จ์ˆ˜] = useState(์ƒํƒœ ์ดˆ๊ธฐ๊ฐ’)

์œ„์˜ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค

const arr = useState(์ƒํƒœ์ดˆ๊ธฐ๊ฐ’);
const state ์ €์žฅ๋ณ€์ˆ˜ = arr[0];
const state ๊ฐฑ์‹ ํ•จ์ˆ˜ = arr[1];
  • state ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด JSX ์—˜๋ฆฌ๋จผํŠธ ์•ˆ์— ์ง์ ‘ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉ
<span>{isChecked ? "Checked!!" : "Unchecked"}</span>
  1. state ๊ฐฑ์‹ ํ•˜๊ธฐ
  • state๋ฅผ ๊ฐฑ์‹ ํ•˜๋ ค๋ฉด state๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋Š” state ๊ฐฑ์‹  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค.
function CheckboxExample() {
  const [isChecked, setIsChecked] = useState(false);

  const handleChecked = (event) => {
    setIsChecked(event.target.checked);
  };

  return (
    <div className="App">
      <input type="checkbox" checked={isChecked} onChange={handleChecked} />
      <span>{isChecked ? "Checked!!" : "Unchecked"}</span>
    </div>
  );
}

๐Ÿ’ฅ์ฃผ์˜: React ์ปดํฌ๋„ŒํŠธ๋Š” tate๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ƒˆ๋กญ๊ฒŒ ํ˜ธ์ถœ๋˜๋ฉฐ, ๋ฆฌ๋ Œ๋”๋งํ•œ๋‹ค.

+ React state๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

const [isChecked, setIsChecked] = useState(false);
// isChecked์— ์žฌํ• ๋‹นXX setIsChecked ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

 

 

์ฐธ๊ณ : ์ฝ”๋“œ์Šคํ…Œ์ด์ธ