useState는 가장 기본적인 hook이며, 함수 컴포넌트에서 가변적인 상태를 가지게 해준다.
//기본형태
const [state, setState] = useState(initialState);
원래는 useState라는 함수가 배열을 반환하고, 이것을 구조분해 문법으로 꺼내놓은 모습일 뿐이다. 우리는 state
를 변수로 사용했고, setState
를 이용해서 state
값을 수정할 수 있다.
만약 state가 원시 데이터타입이 아닌 객체 데이터 타입인 경우에는 불변성을 유지해줘야 한다.
setState를 사용하는 방식은 두가지가 있다.
//기존에 사용하던 방식
setState(number +1);
//함수형 업데이트
setState(() =>{});
위의 코드와 같이 setState의 ()안에 수정할 값이 아니라, 함수를 넣을 수 있다. 그리고 그 함수의 인자에서는 현재의 state를 가져올 수 있고, {}안에서는 이 값을 변경하는 코드를 작성 할 수있다.
// 현재 number의 값을 가져와서 그 값에 +1을 더하여 반환한 것 입니다.
setState((currentNumber)=>{ return currentNumber + 1 });
일반 업데이트 방식으로 onClick안에서 setNumber(number + 1)
를 3번 호출. number가 1씩 증가한다.
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;
함수형 업데이트 방식. number가 3씩 증가한다.
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;
React팀이 위의 방식을 사용하는 이유 :
이전 배열의 인덱스의 값을 변경하고 새로운 배열을 만들어주지 않는다면 리액트는 상태가 바뀌었다는 것을 알지 못한다