근데 useState가 어떻게 작동하는거지?
최적화는?
한번 알아봅시다!
즉, 값을 변경하면 새로 컴포넌트를 렌더링하고, 바뀐 값이 유지되게 해주는 것입니다.
// 0을 기본값으로 가지는 counter 값, 값을 변경하기 위해 사용하는 setCounter를 생성합니다.
// 타입스크립트의 경우 아래와 같이 타입 지정이 가능합니다.
const [counter, setCounter] = useState<number>(0);
// 이전 값을 기반으로 상태를 변경하는 예시입니다, prev는 이전 상태이고, 새로운 값을 리턴하는 함수를 내부에 사용합니다.
const increaseOne = () => {
setCounter(prev => prev + 1);
}
// 바로 값을 변경하는 예시입니다.
const resetCounter = () => {
setCounter(0);
}
return (
<div>
<h1>{counter}</h1>
<button onClick={increaseOne}>
increase by 1
</button>
<button onClick={resetCounter}>
reset
</button>
</div>
)
const [arr, setArr] = useState([]);
// 배열을 사용할수 있다.
setArr(prev => {
return [...prev, newData]
})
// 위와 같이 값을 추가할수 있다!
/**
return {
...prev,
key: value
}
와 같이 객체에 추가 혹은 갱신할수도 있다.
**/
const [test, setTest] = useState(() => {
// 초기값 가져오기
return value;
})
function reducer(state, action) {
switch (action.type) {
case 'INCREMENT':
return state + 1;
case 'DECREMENT':
return state - 1;
default:
return state;
}
}
const [state, dispatch] = useReducer(reducer, 0)
// 두번째 인자는 기본값!
// reducer의 action으로 인자가 전달된다.
// type에 따라 state의 값이 변경되고 reducer에서 바뀐 상태를 return해서 상태가 변경된다.
dispatch({type:'INCREMENT'})