Hooks : useReducer
useReducer는 리액트에서 reducer를 사용하게 해주는 Hook 입니다. 현재 상태, 업데이트에 필요한 정보를 담은 action 값을 전달받아 새로운 상태를 반환하는 함수입니다.
-
action
상태를 변화시키기 위해 필요한 정보를 담은 액션은 다음과 같이 형태로 이루어져 있습니다.
뒷장에서 배울 리덕스에서는 액션안에 이 type 객체가 반드시 있어야 한다고 합니다.
{
type: 'ACTIONTYPENAME',
...
}
카운터 구현
-
view
첫화면은 다음과 같습니다. 아래 +1 버튼을 누르면 current value 값이 1 증가하고, -1 버튼을 누르면 1 감소합니다.
-
source code
import React, { useReducer } from 'react';
function reducer(state, action) {
switch(action.type){
case 'INCREMENT':
return { value: state.value +1 };
case 'DECREMENT':
return { value: state.value -1 };
default:
return state;
}
}
const Counter = () => {
const [state,dispatch] = useReducer(reducer, { value: 0 });
return(
<div>
<h1>Counter›</h1>
<p>current value: {state.value}</p>
<button onClick={() => dispatch({type: 'INCREMENT'})}>+1</button>
<button onClick={() => dispatch({type: 'DECREMENT'})}>-1</button>
</div>
);
}
export default Counter;
useReducer
useReducer의 첫번째 파라미터에 reducer 함수를 넣고, 두번재 파라미터에 리듀서의 기본값을 넣어줍니다.
useReducer Hook에서 state 값과 dispatch 함수를 받아옵니다.
- state : 현재 상태
- dispatch : 액션을 발생시키는 함수로, dispatch(action)으로 리듀서 함수를 호출하여 적절한 action 값에 따른 작업을 수행하게 합니다.
const [state,dispatch] = useReducer(reducer, { value: 0 });
+1, -1 버튼을 각각 클릭하면 onClick 이벤트가 트리거되어 dispatch 함수를 호출합니다. 이때, action 값으로 { type: '..' }을 dispatch 함수에 전달합니다.
<button onClick={() => dispatch({type: 'INCREMENT'})}>+1</button>
<button onClick={() => dispatch({type: 'DECREMENT'})}>-1</button>
dispatch 함수는 reducer 함수를 호출하고, reducer 함수에서는 swtich 문을 통해 전달 받은 action의 type에 따라 state에 작업을 수행합니다.
function reducer(state, action) {
switch(action.type){
case 'INCREMENT':
return { value: state.value +1 };
case 'DECREMENT':
return { value: state.value -1 };
default:
return state;
}
}
References
- 리액트를 다루는 기술 (김민준)
'웹 개발 > React' 카테고리의 다른 글
React) Hooks : useCallback 으로 렌더링 성능 최적화하기 (0) | 2021.02.16 |
---|---|
React) Hooks : useMemo를 이용하여 연산 최적화하기 (0) | 2021.02.16 |
React) 컴포넌트의 수명주기 Lifecycle (0) | 2021.02.16 |
React) 사용자 입력 받아 데이터 추가, 제거하기 (0) | 2021.02.16 |
React) Ref란? (0) | 2021.02.16 |