[S2U6] React State & Props

๐Ÿ‘ฝยท2024๋…„ 3์›” 12์ผ
0
post-thumbnail

CH1. React State & Props

๐Ÿ“Œ Props

๐Ÿ”ธ ์ปดํฌ๋„ŒํŠธ์˜ ์†์„ฑ(property). ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ(์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ)๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์œผ๋กœ ๋ณ€ํ•˜์ง€ ์•Š์Œ.

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

๐Ÿ”ธ ์–ด๋–ค ํƒ€์ž…์˜ ๊ฐ’๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด ํ˜•ํƒœ.

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

๐Ÿ’ก ์ฝ๊ธฐ ์ „์šฉ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด props๋ฅผ ์ „๋‹ฌ๋ฐ›์€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ props๋ฅผ ์ง์ ‘ ์ˆ˜์ • ์‹œ props๋ฅผ ์ „๋‹ฌํ•œ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ’์— ์˜ํ–ฅ์„ ๋ฏธ์นจ. ์ด๋Š” ๋‹จ๋ฐฉํ–ฅ, ํ•˜ํ–ฅ์‹ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์›์น™(React is all about one-way data flow down the component hierarchy) ์— ์œ„๋ฐฐ๋จ.

๐Ÿ“‘ ์‚ฌ์šฉ๋ฒ•

1 . ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’(data)๊ณผ ์†์„ฑ์„ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ •์˜
๐Ÿ”ธ ์šฐ์„  <Parent>์™€ <Child>๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ์–ธํ•˜๊ณ , <Parent> ์ปดํฌ๋„ŒํŠธ ์•ˆ์— <Child>์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑ.
๐Ÿ”ธ ๋ฐฉ๋ฒ• 1) <Child attribute={value} /> : ์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์„ ์ค‘๊ด„ํ˜ธ {}๋ฅผ ์ด์šฉํ•ด ๊ฐ์Œˆ.
๐Ÿ”ธ ๋ฐฉ๋ฒ• 2) <Child>value</Child> : ์—ฌ๋Š” ํƒœ๊ทธ์™€ ๋‹ซ๋Š” ํƒœ๊ทธ์˜ ์‚ฌ์ด์— value๋ฅผ ๋„ฃ์–ด ์ „๋‹ฌ.

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

3. ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์„ ๋žœ๋”๋ง
๐Ÿ”ธ props๋Š” ๊ฐ์ฒด์ด๋ฏ€๋กœ <Parent>์ปดํฌ๋„ŒํŠธ์—์„œ ์ •์˜ํ•œ value๋Š” { attribute : value }์˜ ํ˜•ํƒœ๋ฅผ ๋”.
๐Ÿ”ธ ๋ฐฉ๋ฒ• 1) dot notation์„ ์‚ฌ์šฉํ•˜์—ฌ props์˜ value์— ์ ‘๊ทผ
๐Ÿ”ธ ๋ฐฉ๋ฒ• 2) props.children์„ ์ด์šฉํ•ด ํ•ด๋‹น value์— ์ ‘๊ทผ

function Parent() { 
  return (
    <div className="parent">
      <h1>I'm the parent</h1>
      
      // 1-1. attribute={value}
      <Child text={"I'm the eldest child"} /> 
      
      // 1-2. tag ์‚ฌ์ด์— ์ž…๋ ฅ
      <Child>hi</Child>
      
    </div>
  );
};

// 2. props ์ „๋‹ฌ
function Child(props) { 
  return (
    <div className="child"></div>
    
    // 3-1. dot notation์œผ๋กœ key๋ฅผ ์ž…๋ ฅํ•˜์—ฌ value๋ฅผ ๋ถˆ๋Ÿฌ์˜ด.
    <p>{props.text}</p>
    
    // 3-2. props.children์œผ๋กœ ์ „์ฒด values๋ฅผ ๋ถˆ๋Ÿฌ์˜ด.
    <p>{props.children}</p>
  );
};

๐Ÿ“Œ State

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

useState ์‚ฌ์šฉ๋ฒ•

1. useState๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” React๋กœ๋ถ€ํ„ฐ useState๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•จ. import ํ‚ค์›Œ๋“œ๋กœ useState๋ฅผ ๋ถˆ๋Ÿฌ์˜ด.

import { useState } from "react";

2. useState๋ฅผ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ํ˜ธ์ถœ(= "state"๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ). (๋ณ€์ˆ˜์˜ ์ด๋ฆ„์€ ์•„๋ฌด ์ด๋ฆ„์œผ๋กœ ์ง“๊ธฐ ๊ฐ€๋Šฅ)

๐Ÿ’ก์ผ๋ฐ˜์ ์ธ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋๋‚  ๋•Œ ์‚ฌ๋ผ์ง€์ง€๋งŒ, state ๋ณ€์ˆ˜๋Š” React์— ์˜ํ•ด ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š์Œ.

function CheckboxExample() {
// ์ƒˆ๋กœ์šด state ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , ์—ฌ๊ธฐ์„œ๋Š” ์ด๊ฒƒ์„ isChecked๋ผ ๋ถ€๋ฆ„.
  const [isChecked, setIsChecked] = useState(false); // 1๋ฒˆ
}

  const stateHookArray = useState(false); // 1๋ฒˆ ์ฝ”๋“œ๋ฅผ ํ’€์–ด์“ฐ๋ฉด ์ด์™€ ๊ฐ™์Œ.
  const isChecked = stateHookArray[0];
  const setIsChecked = stateHookArray[1];

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

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

4. ์ด state ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด JSX ์—˜๋ฆฌ๋จผํŠธ ์•ˆ์— ์ง์ ‘ ๋ถˆ๋Ÿฌ์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅ. ์—ฌ๊ธฐ์„œ๋Š” isChecked๊ฐ€ boolean ๊ฐ’์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— true or false ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋ณด์ด๋„๋ก ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•จ.

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

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} /> 
      // ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด onChange์˜ ํ•จ์ˆ˜ handleChecked ํ˜ธ์ถœ๋˜๊ณ  event.target.checked ๊ฐ’์— ๋”ฐ๋ผ ์ฒดํฌ๋ฐ•์Šค์˜ ์ƒˆ๋กœ์šด ์ฒดํฌ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋ƒ„. 
      //checked ์†์„ฑ์€ isChecked ๋ณ€์ˆ˜์˜ ๊ฐ’์œผ๋กœ ์„ค์ •.
      <span>{isChecked ? "Checked!!" : "Unchecked"}</span>
    </div>
  );
}
  • state ๋ณ€์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ธ setIsChecked๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ state๋ฅผ ๊ฐฑ์‹ .
  • ์˜ˆ์‹œ์˜ ๊ฒฝ์šฐ, input[type=checkbox] JSX ์—˜๋ฆฌ๋จผํŠธ์˜ ๊ฐ’ ๋ณ€๊ฒฝ์— ๋”ฐ๋ผ์„œ isChecked๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•จ. ๋ธŒ๋ผ์šฐ์ €์—์„œ checked๋กœ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๋ฉด, React์˜ isChecked๋„ ๋ณ€๊ฒฝ๋จ.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ฒดํฌ๋ฐ•์Šค ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด onChange ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ์ด๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜์ธ handleChecked๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ด ํ•จ์ˆ˜๊ฐ€ setIsChecked๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋จ.
  • setIsChecked๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ˜ธ์ถœ๋œ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ isChecked ๋ณ€์ˆ˜๊ฐ€ ๊ฐฑ์‹ ๋˜๋ฉฐ, React๋Š” ์ƒˆ๋กœ์šด isChecked ๋ณ€์ˆ˜๋ฅผ CheckboxExample ์ปดํฌ๋„ŒํŠธ์— ๋„˜๊ฒจ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋ง.

๐Ÿ’ก ์ฃผ์˜ !

  • React ์ปดํฌ๋„ŒํŠธ๋Š” state๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ํ˜ธ์ถœ๋˜๊ณ , ๋ฆฌ๋ Œ๋”๋ง ๋จ.
  • React state๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ. (์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ์‚ฌ์šฉ์€ React์™€ ๊ฐœ๋ฐœ์ž์˜ ์•ฝ์†. ๊ฐ•์ œ๋กœ ๋ณ€๊ฒฝ์„ ์‹œ๋„ํ•˜๋ฉด, ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๊ฑฐ๋‚˜, state๊ฐ€ ์ œ๋Œ€๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ.)
  • ์˜ˆ์‹œ : state.push(1);, state[1] = 2;, state = 'wrong state';

๐Ÿ“Œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

๐Ÿ”ธ React์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ(Event handling) ๋ฐฉ์‹์€ DOM์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌ.
๐Ÿ”ธ React์—์„œ ์ด๋ฒคํŠธ๋Š” ์†Œ๋ฌธ์ž ๋Œ€์‹  ์นด๋ฉœ ์ผ€์ด์Šค(camelCase)๋ฅผ ์‚ฌ์šฉ.
๐Ÿ”ธ JSX๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ํ•จ์ˆ˜๋กœ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜(์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ; Event handler)๋ฅผ ์ „๋‹ฌ.

<button onclick="handleEvent()">Event</button> // HTML
<button onClick={handleEvent}>Event</button> //React

onChange

๐Ÿ”ธ <input> <textarea> <select>์™€ ๊ฐ™์€ ํผ(Form) ์—˜๋ฆฌ๋จผํŠธ๋Š” ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ์ œ์–ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ. React์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ๊ฐ’์„ ์ผ๋ฐ˜์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ์˜ state๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์—…๋ฐ์ดํŠธ.
๐Ÿ”ธ onChange ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด e.target.value๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ ๊ฐ์ฒด์— ๋‹ด๊ฒจ์žˆ๋Š” input ๊ฐ’์„ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ์Œ.
๐Ÿ”ธ ์ปดํฌ๋„ŒํŠธ return ๋ฌธ ์•ˆ์˜ input ํƒœ๊ทธ์— value์™€ onChange๋ฅผ ๋„ฃ์–ด์คŒ.
๐Ÿ”ธ onChange๋Š” input์˜ ํ…์ŠคํŠธ๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ. ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด handleChange ํ•จ์ˆ˜๊ฐ€ ์ž‘๋™ํ•˜๋ฉฐ, ์ด๋ฒคํŠธ ๊ฐ์ฒด์— ๋‹ด๊ธด input ๊ฐ’์„ setState๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด state๋กœ ๋ณ€๊ฒฝํ•จ.

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

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

  return (
    <div>
      <input type="text" value={name} onChange={handleChange}></input>
      <h1>{name}</h1>
    </div>
  )
};

onClick

๐Ÿ”ธ ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญ์ด๋ผ๋Š” ํ–‰๋™์„ ํ•˜์˜€์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋กœ ๋ฒ„ํŠผ์ด๋‚˜ <a> tag๋ฅผ ํ†ตํ•œ ๋งํฌ ์ด๋™ ๋“ฑ๊ณผ ๊ฐ™์ด ์ฃผ๋กœ ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์— ๋”ฐ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ˜์‘ํ•ด์•ผ ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฒคํŠธ.
๐Ÿ”ธ ์˜ˆ) ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ input tag์— ์ž…๋ ฅํ•œ ์ด๋ฆ„์ด alert์„ ํ†ตํ•ด ์•Œ๋ฆผ ์ฐฝ์ด ํŒ์—… ๋˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€

function SomethingForm() {
  const [name, setName] = useState('');
  
  const handleClick = () => { alert(name); };
  
    return (
    <div>	
        // ๐Ÿ“ 1. ํ•จ์ˆ˜ ์ •์˜
      <button onClick={() => alert(name)}></button>
        
        // ๐Ÿ“ 2. ํ•จ์ˆ˜ ์ž์ฒด ์ „๋‹ฌ
      <button onClick={handleClick}></button>
    </div>
  );
};

๐Ÿ’ก

  • onClick ์ด๋ฒคํŠธ์— alert(name) ํ•จ์ˆ˜๋ฅผ ๋ฐ”๋กœ ํ˜ธ์ถœํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ ํ•จ์ˆ˜ ์ž์ฒด๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ๊ฐ€ onClick์— ์ ์šฉ๋จ.
  • ๋•Œ๋ฌธ์— ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ๊ฐ€ ์•„๋‹Œ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค alert์ด ์‹คํ–‰๋˜์–ด ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ธฐ๋„ ์ „์— alert ์ฐฝ์ด ํ‘œ์‹œ๋จ.
  • ์ด๋•Œ ํ•จ์ˆ˜๋Š” ๋ฆฌํ„ด ๊ฐ’์ด ์—†์„ ๋•Œ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ onClick์— ์ ์šฉ๋˜์–ด ํด๋ฆญํ–ˆ์„ ๋•Œ ์•„๋ฌด๋Ÿฐ ๊ฒฐ๊ณผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Œ.
  • ๋”ฐ๋ผ์„œ onClick ์ด๋ฒคํŠธ์— ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ๋•Œ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฆฌํ„ด๋ฌธ ์•ˆ์—์„œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ๋ฆฌํ„ด๋ฌธ ์™ธ๋ถ€์—์„œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ ํ›„ ์ด๋ฒคํŠธ์— ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•จ.
// ํ•จ์ˆ˜ ์ •์˜ํ•˜๊ธฐ
return (
  <div>
	...
    <button onClick={() => alert(name)}>Button</button>
	...
  </div>
  );
};
// ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ
const handleClick = () => {
  alert(name);
};
return (
  <div>
      ...
    <button onClick={handleClick}>Button</button>
      ...
  </div>
  );
};

๐Ÿ“Œ Controlled Component

๐Ÿ”ธ React๊ฐ€ state๋ฅผ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ

๐Ÿ”ธ ํ†ต์ œํ•˜๋Š” ๋ฒ•์€ input์— ๊ฐ’ ์ž…๋ ฅ ์‹œ, state๋„ ์ฆ‰์‹œ ๋ฐ”๋€Œ๊ณ (onChange) ์ด ๋ณ€๊ฒฝ๋œ state์™€ input์˜ value ๋˜ํ•œ ๊ฐ™๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋ฉด ๋จ.

๐Ÿ”ธ input์˜ value ๋ณ€๊ฒฝ์— ๋”ฐ๋ผ React์˜ state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ.

๐Ÿ“Œ React ๋ฐ์ดํ„ฐ ํ๋ฆ„ : ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„(one-way data flow)

๐Ÿ”ธ React์˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ํŽ˜์ด์ง€ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ, ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ์ . ์•ฑ์˜ ํ”„๋กœํ† ํƒ€์ž…์—์„œ ๋จผ์ € ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ์•„์•ผ ํ•จ.

๐Ÿ”ธ ๋จผ์ € ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ๋‹ค์‹œ ํŽ˜์ด์ง€๋ฅผ ์กฐ๋ฆฝ

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

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

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

๐Ÿ”ธ ์ปดํฌ๋„ŒํŠธ๋Š” props๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋””์„œ ์™”๋Š”์ง€ ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•จ.
๐Ÿ”ธ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ƒํƒœ๋กœ ๋‘˜ ํ•„์š”๋Š” ์—†์œผ๋ฉฐ ์ƒํƒœ๋Š” ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Œ. ์ƒํƒœ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ณต์žกํ•ด์ง. ์ƒํƒœ๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€๋ฅผ ์ถฉ์กฑ.

  • ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ props๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜์ง€ ์•Š์Œ.
  • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋„ ๋ณ€ํ•˜์ง€ ์•Š์ง€ ์•Š์Œ.
  • ์ปดํฌ๋„ŒํŠธ ์•ˆ์˜ ๋‹ค๋ฅธ state๋‚˜ props๋ฅผ ๊ฐ€์ง€๊ณ  ๊ณ„์‚ฐ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Œ.

๐Ÿ”ธ ์ƒํƒœ์˜ ์œ„์น˜

  • ์ƒํƒœ๊ฐ€ ํŠน์ • ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์œ ์˜๋ฏธํ•˜๋‹ค๋ฉด, ํŠน์ • ์ปดํฌ๋„ŒํŠธ์—๋งŒ ๋‘๋ฉด ๋˜๋‹ˆ๊นŒ ํฌ๊ฒŒ ์–ด๋ ต์ง€ ์•Š์ง€๋งŒ, ๋งŒ์ผ ํ•˜๋‚˜์˜ ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‘ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค๋ฉด ์ด๋•Œ์—๋Š” ๊ณตํ†ต ์†Œ์œ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ์•„ ๊ทธ๊ณณ์— ์ƒํƒœ๋ฅผ ์œ„์น˜ํ•ด์•ผ ํ•จ.
  • ๋‘ ๊ฐœ์˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ์ƒํƒœ์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” ๋‘ ์ž์‹์˜ ๊ณตํ†ต ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์— ์ƒํƒœ๋ฅผ ์œ„์น˜ํ•ด์•ผ ํ•จ.
profile
์ฝ”๋ฆฐ์ด๐Ÿ‘ฝ

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