그 전에...
상태는 뭐지?
- 리액트에서 상태란, 컴포넌트 내부에서 변경될 수 있는 동적이고 렌더링에 영향을 주는 값이다.
const [state, setState] = useState(initialState)
🧤 initialState : 초기 값
🧤 state(첫 번째 원소) : 현재 상태
🧤 setState(두 번째 원소) : Setter 함수
[something, setSomething]의 형식으로 구성되어 있다.예시 코드
const Counter = () => {
const [count, setCount] = useState(0);
const increment = () => setCount(count + 1);
const decrement = () => setCount((currentCount) => currentCount - 1);
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
<button onClick={decrement}>Decrement</button>
</div>
)
}
useReducer은 useState와 비슷한 형태를 띠지만 좀 더 복잡한 상태 값을 시나리오에 따라 관리할 수 있다.
const [state, dispatch] = useReducer(reducer, initialArg, init?)
반환값
useState와 동일하게 길이가 2인 배열이다.
🧤 state
🧤 dispatcher
action은 state를 변경할 수 있는 액션을 의미한다.인자
useState의 인수와 달리 2개에서 3개의 인수를 필요로 한다.
🧤 reducer
🧤 inititialState
🧤 init
예시 코드
const reducer = (state, action) => {
switch (action) {
case 'increment':
return state + 1
case 'decrement':
return state - 1
}
}
function App() {
const [count, dispatch] = useReducer(reducer, 0)
return (
<div>
Count: {count}
<button onClick={() => dispatch('increment')}>Increment</button>
<button onClick={() => dispatch('decrement')}>Decrement</button>
</div>
)
}
useState에 변수 대신 함수를 넘기는 것을 게으른 초기화(lazy Initialization) 라고 한다.
- 위의 게으른 초기화 함수는 state가 처음 만들어질 때만 사용되며, 만약 이후에 리렌더링이 발생된다면 이 함수의 실행은 무시된다.
- 추가로,
useState(함수())와 같이 호출하는 방식으로 return 값으로 초기값을 받아오는 경우에는 컴포넌트가 리렌더링 될 때마다 실행된다고 한다.
-> 항상 바쁘게 랜더링이 일어나는 게 아니라 필요할 때 한 번 호출되는 것이기 때문에 '게으른' 초기화가 된 것이다!
결국 게으른 초기화는 성능 최적화 작업이다!
localStorage나 sessionStorage에 대한 접근map, filter, find와 같은 배열에 대한 접근계산을 위해 함수 호출이 필요한 경우출처
https://velog.io/@dee0518/React-useReducer
https://yceffort.kr/2020/10/IIFE-on-use-state-of-react
https://jihyun-hamster.tistory.com/128
https://velog.io/@hoyaho/%EC%A7%80%EC%97%B0-%EC%B4%88%EA%B8%B0%ED%99%94
오오 깔끔하게 작성 잘해주셨네요😊 글 잘 봤습니다! useState의 예제 부분이랑 useReducer의 예제부분을 같은 상황, 내용으로 해주셔서 이해가 더 잘 된 것 같네요 ㅎㅎ 게으른 초기화도 우리가 자주쓰는 키워드 (map, localStorage ...)들이랑 엮어서 사용 상황을 제시해주셔서 기억하기도 좋을 것같아요 !! 🫶
넘 좋은 글 감사합니다🤭 수고하셨어요!
평소에 useState만 써왔는데 이번 기회에 useReducer를 사용해보면 좋겠다는 생각이 들었습니다.
또한 게으른 초기화를 통해 최적화를 할 수 있다는 사실도 처음 알게 되었네요ㅎ
감사합니다!!
useState와 useReducer의 각각의 개념을 친절하게 설명해 주어서 이해하기 너무 편했습니다.
또한, 어느 상황에서 useState 또는 useReducer를 사용하면 좋은지 예시까지 들어주어서 좋았습니다.
깔끔하게 잘 정리된 아티클 잘 보고갑니다!
상태관리의 대표 hook인 useState와 useReducer에 대한 설명 전에 상태 관리, 상태에 대한 개념이 있어서 왜 상태관리 hook 함수를 공부해야 하는지에 대해 알고 보게 되어서 아티클이 더 와닿은것 같아요~ 또 useState와 useReducer의 차이점을 짚어주면서 설명해줘서 둘의 차이점도 확실하게 알고 갑니다! 특히 게으른 초기화 부분에서 초반에 설명한 상태관리의 필요성인 불필요한 랜더링의 최소화에 대한 관점을 강조해서 써주셔서 글 전체에 대한 완성도가 더 높아진거 같아요! 좋은 아티클 써주셔서 감사합니다 수고많으셨습니다~~!!
useState 초기값 설정하는 부분에 함수를 넣을 수 있다는 걸 새롭게 알게되었습니다.
실행 비용이 많이 들 때 게으른 초기화를 사용한다는 개념은 알고있었는데 실행 비용이 많이 들 때가 언젠지에 대한 개념이 모호했는데 비용이 많이 드는 경우도 예시로 잘 소개해주셔서 이해하기 수월했습니다.
useState, useReducer 전에 상태관리가 필요한 이유를 먼저 설명해주신 부분도 해당 hook들을 이해하는 데에 큰 도움이 됐습니다.
유용한 아티클 감사합니당 :) 좋은 정보 많이 얻고갑니다 !!
다은님 아티클 읽고 리액트의 상태관리에 대해 더 자세히 알 수 있었습니다!
useState는 단순한 값의 상태 관리에 적합하고, useReducer는 좀 더 복잡한 상태 로직이나 여러 하위 값들을 포함한 상태를 관리할 때 유용하다는 것을 알 수 있었으며, 언제 useState 와 useReducer 을 사용하는지 예시를 들어주어서 더 쉽게 이해할 수 있었어요!
특히 게으른 초기화에 대한 내용을 통해 리액트의 상태관리가 단순히 상태를 업데이트 하는 것 뿐만 아니라, 어떻게 더 효율적으로 상태를 관리하고 최적화할 수 있는지 더 생각해볼 수 있었습니다!
아티클 너무 잘 읽었습니다! 수고하셨어요!!
useReducer에 대해 잘 몰랐는데, 예제와 비교를 통해 설명해주신 덕분에 자세히 알아갑니다 😊
그 밖에도 상태관리, useState, 게으른 초기화 등의 개념에 대해 더욱 자세히 집고 넘어갈 수 있는 글이네요 ㅎㅎ 좋은 글 감사합니다 !
게으른 초기화를 언제 사용하는지, useReducer를 언제 사용하면 좋을지에 대해 정리해주셔서
좀 더 자세하게 개념들을 이해할 수 있었던 거 같아요! 감사합니다 :)