State & Props

1. ์˜ˆ์‹œ๋กœ ์ดํ•ดํ•˜๊ธฐ

State

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

  • ex) ๋‚˜์ด, ์ฃผ์†Œ, ์ทจ์—… ์—ฌ๋ถ€

Props

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

  • ex) ์ด๋ฆ„, ์„ฑ๋ณ„

2. Props์˜ ํŠน์ง•

์ปดํฌ๋„ŒํŠธ์˜ ์†์„ฑ (property)

  • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง„ (๋ณ€ํ•˜์ง€ ์•Š๋Š”) ์†์„ฑ

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’

  • React ์ปดํฌ๋„ŒํŠธ๋Š” JavaScript ํ•จ์ˆ˜์™€ ํด๋ž˜์Šค๋กœ,

  • props๋ฅผ ํ•จ์ˆ˜์˜ ์ „๋‹ฌ์ธ์ž์ฒ˜๋Ÿผ ๋ฐ›์•„ โ†’ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์— ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋˜๋Š”์ง€๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” React ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฐ˜ํ™˜

  • ๋”ฐ๋ผ์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ตœ์ดˆ ๋ Œ๋”๋ง๋  ๋•Œ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๊ฐ์ฒด ํ˜•ํƒœ

  • ์–ด๋–ค ํƒ€์ž…์˜ ๊ฐ’๋„ ๋„ฃ์–ด ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ

์ฝ๊ธฐ ์ „์šฉ

  • ํ•จ๋ถ€๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†๋Š” ์ฝ๊ธฐ์ „์šฉ (read-only)๊ฐ์ฒด

  • ๋งŒ์•ฝ ์ฝ๊ธฐ ์ „์šฉ์ด ์•„๋‹ˆ๋ผ๋ฉด props๋ฅผ ์ „๋‹ฌํ•œ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ ๊ฐ’์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Œ

  • ๋˜ํ•œ ์˜๋„์น˜ ์•Š์€ side effect์ด๋‚˜ React์˜ ๋‹จ๋ฐฉํ–ฅ/ํ•˜ํ–ฅ์‹ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์›์น™์— ์œ„๋ฐฐ๋จ

3.How to use Props

ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’๊ณผ ์†์„ฑ์„ ์ •์˜

function Parent() { 
  return (
    <div className = 'parent'> // <Parent> ์„ ์–ธ
        <h1>I am the parent</h1>
        <Child /> // <Parent> ์ปดํฌ๋„ŒํŠธ ์•ˆ์— <Child> ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ
    </div>
  );
};

funtion Child() {
  return (
      <div className = 'Child'>
  );
};

props๋ฅผ ์ด์šฉํ•˜์—ฌ ์ •์˜๋œ ๊ฐ’๊ณผ ์†์„ฑ์„ ์ „๋‹ฌ

// ์†์„ฑ ๋ฐ ๊ฐ’์„ ํ• ๋‹นํ•จ, ์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์„ {}๋กœ ๊ฐ์‹ธ์คŒ
<Child attribute = {value} /> 

// text ์†์„ฑ ์„ ์–ธ ํ›„, ์ด ์†์„ฑ์— ๋ฌธ์ž์—ด ๊ฐ’์„ ํ• ๋‹นํ•˜์—ฌ <Child> ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌ
<Child text = {'I am the eldest child'} />  

//<Parent> ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌํ•œ ๋ฌธ์ž์—ด์„ <Child> ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ›์•„์˜ด
function Child(props) {
  return (
    <div className = 'Child'></div>
  );
};

์ „๋‹ฌ๋ฐ›์€ props๋ฅผ ๋ Œ๋”๋ง

function Child(props) { 
  // props๋ผ๋Š” ๊ฐ์ฒด์˜ {key : value}๋Š” <Parent> ์ปดํฌ๋„ŒํŠธ์—์„œ ์ •์˜ํ•œ {attribute : value} ํ˜•ํƒœ๋ฅผ ๋”
  return (
      <div className = 'child'>
      // JavaScript์ฒ˜๋Ÿผ props์˜ value ๋˜ํ•œ Dot notation์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ
      <p>{props.text}</p>
      </div>
  );
};

props children

์—ฌ๋Š” ํƒœ๊ทธ์™€ ๋‹ซ๋Š” ํƒœ๊ทธ ์‚ฌ์ด์— value๋ฅผ ๋„ฃ์–ด ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Œ

function Parent () {
  return (
    <div className = 'parent'>
      <h1>I am the parent</h1>
      <Child>I am the eldest child</Child>
    </div>
  );
};
function Child(props) {
  return (
    <div className = 'child'>
      <p>{props.children}</p>
    </div>
  );
};

4. State hook, useState

useState ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๊ณผ ์ž‘๋™ ๋ฐฉ์‹

// React๋กœ๋ถ€ํ„ฐ useState ๋ถˆ๋Ÿฌ์˜ด
import {useState} from 'react';
// useState๋ฅผ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ํ˜ธ์ถœ: state ๋ณ€์ˆ˜๋Š” React์— ์˜ํ•ด ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š์Œ
function CheckboxExample() {
  // ์ƒˆ๋กœ์šด state ๋ณ€์ˆ˜ ์„ ์–ธ
  const [isChecked, setIsChecked] = useState(false);
}

useState ์ˆ˜๋„์ฝ”๋“œ

// useState๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ
// ๋ฐฐ์—ด์˜ 0๋ฒˆ์งธ ์š”์†Œ๋Š” ํ˜„์žฌ state ๋ณ€์ˆ˜, 1๋ฒˆ์งธ ์š”์†Œ๋Š” ์ด ๋ณ€์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ํ•จ์ˆ˜
// useState์˜ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฐ’์€ state์˜ ์ดˆ๊ธฐ๊ฐ’

const [state ์ €์žฅ๋ณ€์ˆ˜, state ๊ฐฑ์‹ ํ•จ์ˆ˜] = useState(์ƒํƒœ ์ดˆ๊ธฐ๊ฐ’);

useState ๋ฌธ๋ฒ• ์˜ˆ์‹œ

function CheckboxExample() {
  const [isChecked, setIsChecked] = useState(false);
}

// ischecked: state๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜
// setIsChecked: state์ธ isChecked๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜
// useState: state hook
// false: state ์ดˆ๊ธฐ๊ฐ’

JSX ์‚ผํ•ญ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ ์˜ˆ์‹œ

<span>{isChecked ? 'Checked!!' : 'Unchecked'} </span>

5. State ๊ฐฑ์‹ ํ•˜๊ธฐ

  • ๊ฐฑ์‹ ํ•˜๋ ค๋ฉด state ๋ณ€์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ธ setIsChecked๋ฅผ ํ˜ธ์ถœ

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ฒดํฌ๋ฐ•์Šค ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด onchange ์ด๋ฒคํŠธ๊ฐ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜์ธ handleChecked๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ด ํ•จ์ˆ˜๊ฐ€ setIsChecked ํ˜ธ์ถœ

  • setIschecked ํ˜ธ์ถœ๋˜๋ฉด ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ isChecked ๋ณ€์ˆ˜ ๊ฐฑ์‹ 

  • React๋Š” ์ƒˆ๋กœ์šด isChecked ๋ณ€์ˆ˜๋ฅผ CheckboxExample ์ปดํฌ๋„ŒํŠธ์— ๋„˜๊ฒจ, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ ๋‹ค์‹œ ๋ Œ๋”๋ง

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>
  )
}

6. ์ฃผ์˜์ 

  • React ์ปดํฌ๋„ŒํŠธ๋Š” state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ƒˆ๋กญ๊ฒŒ ํ˜ธ์ถœ๋˜๊ณ , ๋ฆฌ๋ Œ๋”๋ง ๋จ

  • React state๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ, ๊ฐ•์ œ๋กœ ๋ณ€๊ฒฝ X

7. ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

  • React์—์„œ ์ด๋ฒคํŠธ๋Š” camelCase ์‚ฌ์šฉ

  • JSX๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌธ์ž์—ด์ด ์•„๋‹Œ, ํ•จ์ˆ˜๋กœ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜ (์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ) ์ „๋‹ฌ

<button onClick = {handleEvent}>Event</button>

onChange

function NameForm() {
  const [name, setName] = useState('');

  const handleChange = (e) => {
    setName(e.target.value);
  }

  return (
    // onChange ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ, e.target.value๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ ๊ฐ์ฒด์— ๋‹ด๊ฒจ์žˆ๋Š” input ๊ฐ’์„ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ์Œ
    // onChange๋Š” input์˜ ํ…์ŠคํŠธ๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ
    // ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ, handleChange ํ•จ์ˆ˜๊ฐ€ ์ž‘๋™ํ•˜๋ฉฐ, ์ด๋ฒคํŠธ ๊ฐ์ฒด์— ๋‹ด๊ธด input ๊ฐ’์„ setState๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด state๋กœ ๊ฐฑ์‹ 
    <div>
      <input type = 'text' value = {name} onChange = {handleChange}></input>
      <h1>{name}</h1>
    </div>
  )
};

onClick

๋ฒ„ํŠผ์ด๋‚˜ <a> ํƒœ๊ทธ๋ฅผ ํ†ตํ•œ ๋งํฌ ์ด๋™ ๋“ฑ ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์— ๋”ฐ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ˜์‘ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฒคํŠธ

function NameForm() {
  const [name, setName] = useState();

  const handleChange = (e) => {
      setName(e.target.value);
  }

  return (
    // ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ input tag์— ์ž…๋ ฅํ•œ ์ด๋ฆ„์ด alert๋ฅผ ํ†ตํ•ด ์•Œ๋ฆผ์ฐฝ์ด ํŒ์—…
    <div>
      <input type = 'text' value = {name} onChange = {handleChange}></input>
      <button onClick = {alert(name)}>Button</button>
      <h1>{name}</h1>
    </div>
  );
};

Last updated