const [state, setState] = useState(initialState);
- useState라는 함수가 배열을 반환하고, 이것을 구조분해문법으로 꺼내놓은 모습.
- state를 변수로, setState로 state를 수정할수 있음.
- state가 원시데이터타입이 아닌 객체 데이터타입일 시 불변성을 유지해주어야함.
기존에 우리는 setState를 사용해서 값을 변경했다.
setState(num +1)
하지만 이 안에 함수형으로 집어 넣을 수도 있다.
setState((currentNum)=> {return currentNum +1) };
뭐가다른데?
먼저 말하자면 일반업데이트방식은 batch로 처리되고, 함수형 업데이트 방식은 순차적으로 처리된다.
// src/App.js
import { useState } from "react";
const App = () => {
const [number, setNumber] = useState(0);
return (
<div>
{/* 버튼을 누르면 1씩 플러스된다. */}
<div>{number}</div>
<button
onClick={() => {
setNumber(number + 1); // 첫번째 줄
setNumber(number + 1); // 두번쨰 줄
setNumber(number + 1); // 세번째 줄
}}
>
버튼
</button>
</div>
);
}
export default App;
위 코드를 보고 버튼을 눌렀을 때 숫자가 3씩 증가한다고 생각할 수도 있다.
하지만 그렇지 않다. 일반 업데이트 방식은 버튼을 클릭했을 때 배칭(batching)되기 때문에,
setNumber 3번을 하나로 모아 최종적으로 한번 실행한다.
따라서 setNumber을 100번을쓰던 100000번을쓰던 결과적으로 1번만 실행된다.
// src/App.js
import { useState } from "react";
const App = () => {
const [number, setNumber] = useState(0);
return (
<div>
{/* 버튼을 누르면 3씩 플러스 된다. */}
<div>{number}</div>
<button
onClick={() => {
setNumber((previousState) => previousState + 1);
setNumber((previousState) => previousState + 1);
setNumber((previousState) => previousState + 1);
}}
>
버튼
</button>
</div>
);
}
export default App;
이번엔 함수형 업데이트 방식이다. 함수형 업데이트 방식은 batch되지않고, 3번의 명령을 모아 순차적으로 각각 1번씩 실행시킨다. 따라서 3씩 증가하게된다.
정리
useState로 참조형데이터를 변경할 때는 불변성을 유지해야한다.
useState는 일반, 함수형 업데이트 방식 총 2가지가 있으며, 각각 다르게 동작한다.
'1차 공부 > React공부' 카테고리의 다른 글
useEffect, clean up (0) | 2022.12.02 |
---|---|
왜 useState가 불변성을 지켜야하고, 방식이 두가지가 있을까? (0) | 2022.12.02 |
Styled-components의 GlobalStyles, css nesting, css reset (0) | 2022.12.02 |
컴포넌트 꾸미기 (Styled Component) (0) | 2022.12.02 |
SPA 방식과 MPA 방식은 무엇인가요? (0) | 2022.11.29 |