useReducer는 useState보다 다양한 상태를 다른 값으로 업데이트할 때 사용하는 Hook이다.
useReducer의 가장 큰 장점은 컴포넌트 업데이트 로직을 컴포넌트 바깥으로 뺄 수 있다는 것이다!!
- useReducer를 알아보기 전에 reducer(리듀서)에 대해 알아보자.
리듀서는 현재 상태와 업데이트를 위해 필요한 정보를 담은 액션 값을 전달받아서 새로운 상태를 반환하는 함수이다.
[예시]
function reducer(상태, 액션) {
switch (액션.type) {
case "증가":
return { value: 상태.value + 1 };
case "감소":
return { value: 상태.value - 1 };
default:
return 상태;
}
}
reducer라는 함수를 선언했고, 매개변수로 상태와 액션이 있다.
(보통은 상태는 state, 액션은 action으로 영어로 작성한다. 예시에서는 보기 쉽게 한글로 작성했다.)
만약 액션의 유형(type)이 증가일 경우 상태의 value를 1 증가시키고 반환,
감소일 경우는 value를 1 감소시키고 반환한다.
아무것도 해당되지 않으면 기존 상태를 반환한다.
⭐중요! 리듀서 함수에서 새로운 상태를 만들 때는 무조건 불변성을 지켜야 한다.⭐
그래서 return {...}로 불변성을 지키면서 업데이트한 새로운 상태를 반환하는 것을 알 수 있다.
- 대망의 이번 게시글의 주인공인 useReducer를 살펴보자.
const CounterReducer = () => {
const [state, dispatch] = useReducer(reducer, { value: 0 });
return (
<div>
<p>
현재 카운터 값 : <b>{state.value}</b>
</p>
<button onClick={() => dispatch({ type: "증가" })}>+1</button>
<button onClick={() => dispatch({ type: "감소" })}>-1</button>
</div>
);
};
export default CounterReducer;
const [state, dispatch] = useReducer(reducer, initialState);
위 코드를 두 가지로 나눠서 설명해보자면,
useReducer(reducer, initialState) : useReducer의 매개변수로 리듀서 함수와 해당 리듀서의 기본값을 넣어 준다.
const [state, dispatch] : 현재 가리키고 있는 상태인 state 값과 액션을 발생시키는 dispatch 함수를 받아 온다.
dispatch는 dispatch(액션) 형태로, 매개변수로 액션 값을 넣어 주면 우리가 정의해둔 리듀서 함수가 호출된다!
return (
<div>
<p>
현재 카운터 값 : <b>{state.value}</b>
</p>
<button onClick={() => dispatch({ type: "증가" })}>+1</button>
<button onClick={() => dispatch({ type: "감소" })}>-1</button>
</div>
);
};
현재 카운터 값은 {state.value}로 불러올 수 있고
+1 / -1 버튼을 클릭할 때마다 우리가 정의해둔 type에 맞게 액션이 dispatch로 잘 들어오는 걸 알 수 있다.
+ 쓸모없는 TMT)
reducer 단어의 뜻이 무엇인지 궁금해져서 찾아보았다.
선형대수학에서 reduction이란 일련의 방정식이나 행렬에 간단한 규칙을 적용하여 더 간단한 형태로 바꾸는 것을 뜻한다.
우리가 사용하는 reducer도 간단한 규칙을 적용하여 더 간단한 형태로 바꾸는 것으로 볼 수 있다!!
주어진 현재 상태(state)를 새로운 상태(state)로 고쳐나간다.
그래서 작명할 때 reducer라고 한 것일지도....라는 나의 생각이다.
'IT > React' 카테고리의 다른 글
[리액트] 코드 분할(코드 스플리팅) - React lazy, Suspense, Loadable Components (0) | 2021.08.23 |
---|---|
[리액트] 웹팩(webpack), 코드 분할(code splitting) 간단 설명 (0) | 2021.08.21 |
[리액트] API 키 숨기기, 환경 변수 401 오류와 undefined 해결 (0) | 2021.08.06 |
[리액트] 리액트 필수 크롬 확장 프로그램 (react developer tool) (4) | 2021.07.25 |
[리액트] 버튼 클릭시 요소 표시, 숨기기 (0) | 2021.07.23 |