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