function reducer (state, action) {
if (action.type == "INCREMENT") // action에 따라 분기
return state + 1;
else if (action.type == "DECREMENT")
return state - 1;
return state; // 새로운 상태를 리턴
}
function App() {
const [result, dispatch] = useReducer(reducer, 0);
dispatch(result, "INCREMENT");
return (
<div>{result}</div> // <div>1</div>
)
}
useReducer 함수는 useState 대신에 쓸 수 있는 함수이다.
useReducer는 useState의 setState와 다르게 컴포넌트 바깥에 정의할 수 있어서, '컴포넌트 바깥에서 state 업데이트가 가능'은 물론 다른 파일에서도 가능하다는 장점이 있다.
정확히는 컴포넌트 바깥에 있는 reducer 함수에서 state 업데이트가 가능하다고 말할 수 있다.
useReducer의 사용법은 아래와 같다.
const [ state명, 업데이트함수를 호출할 함수명] = useReducer(업데이트함수명, 초기값);
state명에는 변수 state의 이름을 넣어준다.
업데이트함수를 호출할 함수명은 이전에 정의해놓은 것을 여기에 넣으라는 게 아니다. useReducer의 파라미터로 업데이트할 함수를 적어주면 리턴값으로 그 업데이트함수를 호출할 함수를 리턴해주는데 이것의 이름을 새로 지어 넣는다.
useReducer의 파라미터로는 '업데이트할 함수명'과 '초기값'을 넣는다.
초기값이 0인 상태 a가 있는데 이것을 업데이트할 함수명이 reducer라고 치면 아래와 같이 된다.
const [a, callReducer] = useReducer(reducer, 0);
그리고 이렇게 정의한 callReducer는 상태를 업데이트할 부분에서 callReducer(액션객체)와 같이 사용한다.
액션객체는 무엇일까? 내가 내린 정의로는 자기가 if문에 넣을 플래그 등을 담은 커스텀 객체이다.
type이 INCREMENT면 +1을 하고 싶으면 이 액션객체에 type을 INCREMENT라고 명시해서 보내면 되는데
callReducer({type: 'INCREMENT'}) 와 같이 사용하면 된다.
그리고 callReducer로 호출된 reducer 함수에서는 새로운 상태를 반환하도록 하게 하면 된다.
'프론트엔드 > React' 카테고리의 다른 글
React.memo (0) | 2021.09.12 |
---|---|
useCallback (0) | 2021.09.06 |
useMemo (0) | 2021.09.06 |
useEffect (0) | 2021.09.03 |
useRef (0) | 2021.09.03 |