const [state, setState] = useState(initialState);
setState(newState);
주의
React는 setState 함수가 리렌더링 중에 변경되지 않을 것을 보장한다. 이것이 useEffect나 useCallback 의존성 목록에 setState 함수를 포함하지 않는 이유이다.
=> useEffect나 useCallback의 의존성 배열에 setState 함수를 넣지 않는다!
function Counter({initialCount}) {
const [count, setCount] = useState(initialCount);
return (
<>
Count: {count}
<button onClick={() => setCount(initialCount)}>Reset</button>
<button onClick={() => setCount(prevCount => prevCount - 1)}>-</button>
<button onClick={() => setCount(prevCount => prevCount + 1)}>+</button>
</>
);
}
주의
클래스 컴포넌트의 setState 메서드와 달리, useState는 갱신되는 객체(update objects)를 이전 내용과 자동으로 합치지 않는다. useState에서는 setState의 반환 값에 전개 연산자를 활용하여 이 동작을 복제할 수 있다.const [state, setState] = useState({}); setState(prevState => { return {...prevState, ...updatedValues}; });
다른 방법으로는 useReducer가 있다. 이는 여러 개의 하윗값들을 포함한 state 객체를 관리하는 데에 더 적합하다.
=> 즉, useState의 setState 함수의 반환값에 spread 연산자를 써야 하는 경우(= 객체의 일부를 변경하는 경우), useState보다 useReducer를 쓰는 것이 더 낫다!