useState

ํ•™์Šต ํ‚ค์›Œ๋“œ

  • useState

    • initialState

    • state

    • setState

      • ๋น„๋™๊ธฐ์™€ ์ผ๊ด„์ฒ˜๋ฆฌ(batch)

      • ํด๋กœ์ €์™€ ํ

๐Ÿ“– useState

  • state(์ƒํƒœ)๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—…๋ฐ์ดํŠธ(setState)๋ฅผ ํ†ตํ•ด ํ™”๋ฉด(UI)์„ (๋ฆฌ)๋ Œ๋”๋งํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

๐Ÿค– useState ์‚ฌ์šฉ๋ฒ•

import { useState } from "react"; // ์‚ฌ์šฉ์„ ์œ„ํ•ด import ํ•ด์ค˜์•ผ ํ•˜๊ณ ,

const [state, setState] = useState(์ดˆ๊ธฐ๊ฐ’); // ํ•ด๋‹น ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ตœ์ƒ์œ„์— ์„ ์–ธํ•ด์ค€๋‹ค.

state ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ๊ฐ€์ ธ์•ผ ํ•  ์ดˆ๊ธฐ๊ฐ’์„ useState ํ•จ์ˆ˜์— ์ธ์ž๋กœ ๋„ฃ์–ด์ฃผ๋ฉด state, setState ๋‘๊ฐ€์ง€์˜ ์š”์†Œ๋ฅผ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.

์ตœ์ดˆ ๋ Œ๋”๋ง์‹œ state๋Š” ์ธ์ž๋กœ ๋ฐ›์€ ์ดˆ๊ธฐ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , setState๋Š” state๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

useState(initialState)

import { useState } from 'react';

function MyComponent() {
  const [age, setAge] = useState(28);
  const [name, setName] = useState('Taylor');
  const [todos, setTodos] = useState(() => createTodos());

}

state

const [form, setForm] = useState({
   firstName: 'Barbara',
   lastName: 'Hepworth',
   email: 'bhepworth@sculpture.com',
});

// ์ง์ ‘์ ์œผ๋กœ ๊ฐ’์„ ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ.
form.firstName = "Taylor" 

// setForm ์ƒํƒœ๋ณ€ํ™” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ ๋ณ€๊ฒฝ 
setForm({
  ...form,
  firstName: 'Taylor'
});

state๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด setState ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ธ์ž๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์€ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด state๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ณ  state๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง(์—…๋ฐ์ดํŠธ)ํ•˜๊ฒŒ ๋œ๋‹ค.

setState(nextState)

  • ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜์—ฌ state๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

  • ์ด์ „์˜ ์ƒํƒœ๊ฐ’์„ ์–ป๊ณ  ์‹ถ๋‹ค๋ฉด ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

import { useState } from 'react';

export default function Index() {
  const [count, setCount] = useState(0);
  const onClick = () => {
    setCount(count + 1); // 0 + 1
    setCount(count + 1); // 0 + 1
    setCount(count + 1); // 0 + 1   <- ์ด ์ฝ”๋“œ๋งŒ ์ ์šฉ๋จ
    console.log(count); // 0
  };
  return (
    <div>
      <p> ํ˜„์žฌ state : {count}</p>
      <button type="button" onClick={onClick}>
        +3
      </button>
    </div>
  );
}

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ๋ณด๋ฉด console.log(state) ๊ฐ’์€ ์ด์ „์˜ ์ƒํƒœ๊ฐ’์ธ 0์ด ์ถœ๋ ฅ๋˜๊ณ , state ๊ฐ’์€ 1์ด๋‹ค. โ‡’ ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์ด์œ ๋Š” setState ํ•จ์ˆ˜๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  React๊ฐ€ ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜ ๋‚ด์˜ ๋กœ์ง์„ ๋ชจ๋‘ ์ฝ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ์— ์ผ๊ด„ ์ฒ˜๋ฆฌ(Batch)ํ•ด ํ•œ๋ฒˆ์— ๋ Œ๋”๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐Ÿค” ์™œ React๋Š” ์ƒํƒœ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์„๊นŒ?

React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ˆ˜ ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ์™€ ์ƒํƒœ๊ฐ’์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ๋‹จ ํ•˜๋‚˜์˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ™”ํ•  ๋•Œ๋งˆ๋‹ค ๊ด€๋ จ๋œ ๋ทฐ๋ฅผ ๋งค๋ฒˆ ๋ฆฌ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ๊ณผ ํ•จ๊ป˜ ์„ฑ๋Šฅ์ƒ์˜ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•œ๋‹ค.

๐Ÿค” ์—ฐ์†๋œ setState๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€?

  • setStateํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

  • useEffect์˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค.

import { useState } from 'react';

export default function Index() {
  const [count, setCount] = useState(0);
  const onClick = () => {
    setCount((count) => count + 1); // 0+1 count โ†’ 1
    setCount((count) => count + 1); // 1+1 count โ†’ 2
    setCount((count) => count + 1); // 2+1 count โ†’ 3
    console.log(count); // 0
  };
  return (
    <div>
      <p> ํ˜„์žฌ state : {count}</p>
      <button type="button" onClick={onClick}>
        +3
      </button>
    </div>
  );
}

๐Ÿ”— ์ฐธ๊ณ 

Last updated