Sharing State Between Components

date
2026-02-05
order
3
link
  • Sharing State Between Components โ€“ React

You will learn

  • 'state ๋Œ์–ด ์˜ฌ๋ฆฌ๊ธฐ'๋กœ ์–ด๋–ป๊ฒŒ ์ปดํฌ๋„ŒํŠธ๊ฐ„์— state๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€
  • ์ œ์–ด ์ปดํฌ๋„ŒํŠธ, ๋น„์ œ์–ด ์ปดํฌ๋„ŒํŠธ๋ž€ ๋ฌด์—‡์ธ์ง€

Lifting state up

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

  • Accordion
    • Panel
    • Panel

์—ฌ๊ธฐ์„œ ํ•˜๋‚˜์˜ Panel ์ปดํฌ๋„ŒํŠธ๋งŒ ์—ด๋ฆฌ๊ธธ ์›ํ•œ๋‹ค๋ฉด? ์ฆ‰ ํ•œ Panel ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ด๋ฉด ๋‹ค๋ฅธ Panel ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ซ๊ณ  ์‹ถ๋‹ค๋ฉด? ๊ฐ Panel ์ปดํฌ๋„ŒํŠธ์—์„œ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์˜ state๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜์˜ ๋ถ€๋ชจ์ธ Accordion ์—์„œ ์–ด๋–ค Panel ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ค„์ง€ ๊ฒฐ์ •ํ•˜๋Š” state๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ž์‹์—๊ฒŒ ๊ฑด๋‚ด์ค˜์•ผ ํ•œ๋‹ค. ์ฆ‰ state ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

export default function Accordion() {
  const [activeIndex, setActiveIndex] = useState(0);
  return (
    <>
      <h2>Almaty, Kazakhstan</h2>
      <Panel
        title="About"
        isActive={activeIndex === 0}
        onShow={() => setActiveIndex(0)}
      >
        //...
      </Panel>
      <Panel
        title="Etymology"
        isActive={activeIndex === 1}
        onShow={() => setActiveIndex(1)}
      >
        //...
      </Panel>
    </>
  );
}

function Panel({
  title,
  children,
  isActive,
  onShow
}) {
  return (
    <section className="panel">
      <h3>{title}</h3>
      {isActive ? (
        <p>{children}</p>
      ) : (
        <button onClick={onShow}>
          Show
        </button>
      )}
    </section>
  );
}

์ด๋ ‡๊ฒŒ ์ž์‹์—๊ฒŒ ๋‘ ๊ฐ€์ง€๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

  1. state ์™€
  2. state ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ

์ œ์–ด controlled vs ๋น„์ œ์–ด uncontrolled

๋ฐ”๋กœ ์œ„์˜ ๋ฐฉ์‹์ฒ˜๋Ÿผ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ props๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ œ์–ด ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž์‹์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ์ง€ ๋ถ€๋ชจ๊ฐ€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฐ˜๋Œ€๋กœ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์ง€์—ญ state๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ ๋น„์ œ์–ด ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ํ•œ๋‹ค. ๋น„์ œ์–ด ์ปดํฌ๋„ŒํŠธ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ฐ„ํŽธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์—ฐํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

๋งŽ์€ ๊ฒฝ์šฐ "์ œ์–ด"์™€ "๋น„์ œ์–ด"๊ฐ€ ๋ถ„๋ช…ํžˆ ๊ตฌ๋ถ„๋˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ตฌ๋ถ„์„ ํ†ตํ•ด ์–ด๋–ค ์ •๋ณด๊ฐ€ props๋กœ ์ œ์–ด๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์–ด๋–ค ์ •๋ณด๋Š” state๋กœ ๋น„์ œ์–ด ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณด๋Š” ๊ด€์ ์„ ์ œ๊ณตํ•œ๋‹ค.

์˜ˆ์‹œ ๋ฌธ์ œ

2. ๊ฒ€์ƒ‰์–ด ํ•„ํ„ฐ๋ง

์ž…๋ ฅ์ฐฝ์— ๋„ฃ์€ ๊ฒ€์ƒ‰๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ํ•„ํ„ฐ๋ง ๋œ ๊ฒฐ๊ณผ๋งŒ ๋ณด์—ฌ์ฃผ๋„๋ก ์ˆ˜์ •ํ•˜๋Š” ๋ฌธ์ œ.

export default function FilterableList() {
  const [query, setQuery] = useState('');
  return (
    <>
      <SearchBar query={query} onChange={(e)=>setQuery(e.target.value)} />
      <hr />
      <List items={foods} query={query} />
    </>
  );
}

function SearchBar({query, onChange}) {
  return (
    <label>
      Search:{' '}
      <input
        value={query}
        onChange={onChange}
      />
    </label>
  );
}

function List({ items,query }) {
  const result = filterItems(items,query);
  return (
    <table>
      <tbody>
        {result.map(food => (
          <tr key={food.id}>
            <td>{food.name}</td>
            <td>{food.description}</td>
          </tr>
        ))}
      </tbody>
    </table>
  );
}

๋‚˜๋Š” ์œ„์—์ฒ˜๋Ÿผ List ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•„ํ„ฐ๋ง์„ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ ๋‹ต์•ˆ์—์„œ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์ธ FilterableList์—์„œ ํ•„ํ„ฐ๋งํ•œ ํ›„์— List ์ปดํฌ๋„ŒํŠธ์— ํ•„ํ„ฐ๋ง ๊ฒฐ๊ณผ๋ฅผ ๊ฑด๋‚ด์ฃผ๋„๋ก ์„ค๊ณ„ํ–ˆ๋‹ค.

๋ถ€๋ชจ์—์„œ ๊ณ„์‚ฐํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๊ฑด๋‚ด์ฃผ๋Š” ๋‹ต์•ˆ์˜ ๋ฐฉ์‹์ด ๋” ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  • List ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํŠน์ • ๋กœ์ง์— ์ข…์†๋˜์ง€ ์•Š๊ฒŒ ๋˜๊ณ  (์žฌ์‚ฌ์šฉ์„ฑ)
  • List ์ปดํฌ๋„ŒํŠธ๋Š” UI ์ปดํฌ๋„ŒํŠธ๋กœ์„œ ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ–๋Š”๋‹ค. (๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ)