Unit6 - [React] React State & Props

์˜ˆ์ง„ยท2022๋…„ 10์›” 4์ผ
0

๐Ÿ”ฅ React State & Props

state : ๋‚ด๋ถ€์—์„œ ๋ณ€ํ™”ํ•˜๋Š” ๊ฐ’ / ex. ๋‚˜์ด, ํ˜„์žฌ ์‚ฌ๋Š” ๊ณณ, ์ทจ์—… ์—ฌ๋ถ€...
Props : ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’ / ex. ์ด๋ฆ„, ์„ฑ๋ณ„...

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

1. Props

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

  • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ(์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ)๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’
    React ์ปดํฌ๋„ŒํŠธ๋Š” JavaScript ํ•จ์ˆ˜์™€ ํด๋ž˜์Šค๋กœ, props๋ฅผ ํ•จ์ˆ˜์˜ ์ „๋‹ฌ์ธ์ž(argument)์ฒ˜๋Ÿผ ์ „๋‹ฌ๋ฐ›์•„ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์— ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋˜๋Š”์ง€๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” React ์—˜๋ฆฌ๋จผํŠธ ๋ฐ˜ํ™˜ => ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ตœ์กฐ ๋ Œ๋”๋ง ๋  ๋•Œ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ์ดˆ๊นƒ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • ํ•จ๋ถ€๋กœ ๋ณ€๊ฒฝ ๋  ์ˆ˜ ์—†๋Š” ์ฝ๊ธฐ ์ „์šฉ(read-only) ๊ฐ์ฒด
    ์ฝ๊ธฐ ์ „์šฉ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด prop๋ฅผ ์ „๋‹ฌ๋ฐ›์€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ props๋ฅผ ์ง์ ‘ ์ˆ˜์ • ์‹œ props๋ฅผ ์ „๋‹ฌํ•œ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ’์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค. => React์˜ ๋‹จ๋ฐฉํ–ฅ, ํ•˜ํ–ฅ์‹ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์›์น™ ์œ„๋ฐฐ

    props ์‚ฌ์šฉ๋ฒ•

  1. ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’(data)๊ณผ ์†์„ฑ์„ ์ •์˜ํ•œ๋‹ค.
    JSX ์†์„ฑ๊ณผ ๊ฐ’ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ• : ์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์„ ์ค‘๊ด„ํ˜ธ{}๋กœ ๊ฐ์‹ธ์ค€๋‹ค
    <Child attribute={value}/>

  2. props๋ฅผ ์ด์šฉํ•˜์—ฌ ์ •์˜๋œ ๊ฐ’๊ณผ ์†์„ฑ์„ ์ „๋‹ฌํ•œ๋‹ค.
    props์˜ ์†์„ฑ์€ ์—ฌ๋Ÿฌ ๊ฐœ ์ง€์ • ๊ฐ€๋Šฅ

  3. ์ „๋‹ฌ๋ฐ›์€ props๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.
    props๋Š” ๊ฐ์ฒด์ด๊ณ , ์ด ๊ฐ์ฒด์˜ {key:value}์€ attribute={value}์˜ ํ˜•ํƒœ๋ฅผ ๋ค๋‹ค.
    JavaScript์—์„œ ๊ฐ์ฒด์˜ value์— ์ ‘๊ทผํ•  ๋•Œ์™€ ๋™์ผํ•˜๊ฒŒ dot notaion ์‚ฌ์šฉ

// Parent ์ปดํฌ๋„ŒํŠธ ์„ ์–ธ, ์•ˆ์— Child ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ
function Parent() {
  return (
    <div className="parent">
    <h1>parent</h1>
    // JSX ์†์„ฑ๊ณผ ๊ฐ’ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•, ์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์„ ์ค‘๊ด„ํ˜ธ{}๋กœ ๊ฐ์‹ธ์ค€๋‹ค
    <Child text={"I'm the eldest child"}/>
    </div>
    );
};

// Child ์ปดํฌ๋„ŒํŠธ ์„ ์–ธ
function Child(props) {  // props๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ฐ€์ง€๊ณ  ์˜จ๋‹ค
  return (
    <div className="child">
    	// ์ „๋‹ฌ๋ฐ›์€ props ๋ Œ๋”๋ง, dot notaion ์‚ฌ์šฉํ•ด ๊ฐ์ฒด์˜ ๊ฐ’์— ์ ‘๊ทผํ•œ๋‹ค
    	<p>{props.text}</p>   
    </div>
    );
};

props.children

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

export default Parent;

2. State

: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ

  • ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’, ์ƒํƒœ๋Š” React state๋กœ ๋‹ค๋ค„์•ผํ•œ๋‹ค.

useState ์‚ฌ์šฉ๋ฒ•

  1. import ํ‚ค์›Œ๋“œ๋กœ useState๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
import { useState } from "react";
  1. useState๋ฅผ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ํ˜ธ์ถœํ•œ๋‹ค.
    useState๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค = state๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค (๋ณ€์ˆ˜ ์ด๋ฆ„์€ ์ƒ๊ด€x)
    ์ผ๋ฐ˜์ ์ธ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋๋‚  ๋•Œ ์‚ฌ๋ผ์ง€์ง€๋งŒ state ๋ณ€์ˆ˜๋Š” React์— ์˜ํ•ด ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค.

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

const [state ์ €์žฅ๋ณ€์ˆ˜, state ๊ฐฑ์‹  ํ•จ์ˆ˜ ] = useState(์ƒํƒœ ์ดˆ๊นƒ๊ฐ’);
  1. state ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด JSX ์—˜๋ฆฌ๋จผํŠธ ์•ˆ์— ์ง์ ‘ ๋ถˆ๋Ÿฌ์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

state ๊ฐฑ์‹ ํ•˜๊ธฐ

import React, { useState } from "react";

function CheckboxExample() {
  // ์ƒˆ๋กœ์šด state ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ, isChecked
  // const [state ์ €์žฅ ๋ณ€์ˆ˜, state ๊ฐฑ์‹  ํ•จ์ˆ˜] = useState(state ์ดˆ๊นƒ๊ฐ’);
  const [isChecked, setIsChecked] = useState(false);
  
  const handleChecked = (event) => {
    // state๋ฅผ ๊ฐฑ์‹ ํ•˜๋ ค๊ณ  state ๋ณ€์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ธ setIsChecked ํ˜ธ์ถœ
    setIsChecked(event.target.checked);
  };
  
  return (
    <div className="App">
    	<input type="checkbox" checked={isChecked} onChange={handleChecked}/>
    	// state ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด JSX ์—˜๋ฆฌ๋จผํŠธ ์•ˆ์— ์ง์ ‘ ๋ถˆ๋Ÿฌ์„œ ์‚ฌ์šฉํ•œ๋‹ค
    	<span>{isChecked ? "Checked!" : "Unchecked"}</span>
	</div>
  );
};

export default CheckboxExample;

์ฃผ์˜์ 

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

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

React์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ(Event handling) ๋ฐฉ์‹์€ DOM์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๋‹ค.
๋‹จ, ์•„๋ž˜ ๋ช‡๊ฐ€์ง€ ๋ฌธ๋ฒ• ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

  • React์—์„œ ์ด๋ฒคํŠธ๋Š” ์†Œ๋ฌธ์ž ๋Œ€์‹  ์นด๋ฉœ ์ผ€์ด์Šค(camelCase) ์‚ฌ์šฉ
  • JSX๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ํ•จ์ˆ˜๋กœ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜(Event handler) ์ „๋‹ฌ

<input>, <textarea>, <select>์™€ ๊ฐ™์€ ํผ(Form) ์—˜๋ฆฌ๋จผํŠธ๋Š” ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ์ œ์–ดํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ๊ฐ’์„ ์ผ๋ฐ˜์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ์˜ state๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

onChange
: input์˜ ํ…์ŠคํŠธ๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ
์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์ž‘๋™ํ•˜๊ณ , ์ด๋ฒคํŠธ ๊ฐ์ฒด์— ๋‹ด๊ธด input๊ฐ’์„ setState๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด state๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค.

import React, { useState } from "react";

function NameForm() {
  const [name, setName] = useState("");
  
  const handleChage = (e) => {
    // `onChange` ์ด๋ฒคํŠธ ๋ฐœ์ƒํ•˜๋ฉด `e.target.value`๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ ๊ฐ์ฒด์— ๋‹ด๊ฒจ์žˆ๋Š” input ๊ฐ’์„ ์ฝ์–ด์˜จ๋‹ค
    setName(e.target.value);
  }
  
  return (
    <div>
     <input type="text" value={name} onChange={handleChage}></input>
	 <h1>{name}</h1>
    </div>
	)
};
export default NameForm;

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

import React, { useState } from "react";

function NameForm() {
  const [name, setName] = useState("");
  
  const handleChange = (e) => {
    setName(e.target.value);
  }
  
  const handleClick = () => {
    alert(name);
  };

  return (
    <div>
      <input type="text" value={name} onChange={handleChange}></input>
	  // ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ input ํƒœ๊ทธ์— ์ž…๋ ฅํ•œ ์ด๋ฆ„์ด alert์„ ํ†ตํ•ด ์•Œ๋ฆผ ์ฐฝ์ด ํŒ์—… ๋˜๋„๋ก ํ•œ๋‹ค
      <button onClick={handleClick}>Button</button>
	  {/* <button onClick={() => alert(name)}>Button</button> */}
      <h1>{name}</h1>
    </div>
  );
};
export default NameForm;

onClick ์ด๋ฒคํŠธ์— ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ๋•Œ, (ํ•จ์ˆ˜ ํ˜ธ์ถœ x)
๋ฆฌํ„ด๋ฌธ ์•ˆ์—์„œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜, ๋ฆฌํ„ด๋ฌธ ์™ธ๋ถ€์—์„œ ํ•จ์ˆ˜ ์ •์˜ ํ›„ ์ด๋ฒคํŠธ์— ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•œ๋‹ค.
=> arrow function ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์•ผ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง„ state์— ํ•จ์ˆ˜ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.


4. React ๋ฐ์ดํ„ฐ ํ๋ฆ„

React๋Š” ํŽ˜์ด์ง€ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•œ๋‹ค.

  • ์ƒํ–ฅ์‹(bottom-up)์œผ๋กœ ์•ฑ์„ ๋งŒ๋“ ๋‹ค.
    ํ…Œ์ŠคํŠธ๊ฐ€ ์‰ฝ๊ณ , ํ™•์žฅ์„ฑ์ด ์ข‹๋‹ค (์ปดํฌ๋„ŒํŠธ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์ œ์ผ ๋จผ์ € ํ•ด์•ผํ•  ์ผ)

  • ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•œ ๊ฐ€์ง€ ์ผ๋งŒ ํ•œ๋‹ค. (๋‹จ์ผ ์ฑ…์ž„ ์›์น™)

  • ๋ฐ์ดํ„ฐ๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ ํ๋ฅธ๋‹ค.
    ์ปดํฌ๋„ŒํŠธ ๋ฐ”๊นฅ์—์„œ props๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ž(arguments) ๋˜๋Š” ์†์„ฑ(attributes)์ฒ˜๋Ÿผ ์ „๋‹ฌ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
    ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ฃผ์ฒด๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋œ๋‹ค. => ํ•˜ํ–ฅ์‹(top-down) ๋ฐ์ดํ„ฐ ํ๋ฆ„

  • React ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„(one-way data flow)์„ ๋”ฐ๋ฅธ๋‹ค.

- ์ƒํƒœ(state) ์œ„์น˜ ์ •ํ•˜๊ธฐ
๋‘ ๊ฐœ์˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ์ƒํƒœ์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•  ๋•Œ,
๊ณต๋™ ์†Œ์œ  ์ปดํฌ๋„ŒํŠธ(๊ณตํ†ต์˜ ๋ถ€๋ชจ)๋ฅผ ์ฐพ์•„ ๊ทธ ๊ณณ์— ์ƒํƒœ๋ฅผ ์œ„์น˜ํ•ด์•ผ ํ•œ๋‹ค.
๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ, ์ปดํฌ๋„ŒํŠธ๋“ค ๊ฐ„์˜ ์ƒํ˜ธ ๊ด€๊ณ„์™€ ๋ฐ์ดํ„ฐ์˜ ์—ญํ• , ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ๊ณ ๋ คํ•ด ์œ„์น˜๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

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