이번 챕터에서는 상태를 다루기 위해 만들었던 상태 변경 로직을 컴포넌트로 부터 분리하여 단순한 함수 컴포넌트를 만들기 위해서 Redux를 배워보는 시간이다. 😀
먼저 Reducer에 대하여 알아보자!
Reducer는 Dispatch에게서 전달받은 Action 객체의 type 값에 따라서 상태를 변경시키는 함수이다.
Reducecr는 순수함수여야 한다.
const [state, dispatch] = useReducer(reducer, initialState);
const count = 1
// Reducer를 생성할 때에는 초기 상태를 인자로 요구합니다.
const counterReducer = (state = count, action) => {
// Action 객체의 type 값에 따라 분기하는 switch 조건문입니다.
switch (action.type) {
//action === 'INCREASE'일 경우
case 'INCREASE':
return state + 1
// action === 'DECREASE'일 경우
case 'DECREASE':
return state - 1
// action === 'SET_NUMBER'일 경우
case 'SET_NUMBER':
return action.payload
// 해당 되는 경우가 없을 땐 기존 상태를 그대로 리턴
default:
return state;
}
}
// Reducer가 리턴하는 값이 새로운 상태가 됩니다.
Reducer에서는 Action 객체의 type 값에 따라 분기하는 switch 조건문을 만들어주고 Counter 컴포넌트에서는 useReducecr 를 선언하여 dispatch 를 하여 Action을 받아온다.
Dispatch는 Reducer로 Action을 전달해 주는 함수이다. Dispatch의 전달인자로 Action 객체가 전달된다.
// Action 객체의 직접 작성
dispatch( { type: 'INCREASE' } );
dispatch( { type: 'SET_NUMBER', payload: 5 } );
Redux Hooks는 React-Redux에서 Redux를 사용할 때 활용할 수 있는 Hooks 메서드를 제공한다. 그중에서 크게 useSelector(), useDispatch() 이 두 가지의 메서드를 기억해야 한다.
useDispatch()는 Action 객체를 Reducer로 전달해 주는 Dispatch 함수를 반환하는 메서드이다.
import { useDispatch } from 'react-redux'
const dispatch = useDispatch()
dispatch( increase() )
console.log(counter) // 2
dispatch( setNumber(5) )
console.log(counter) // 5
useSelector()는 컴포넌트와 state를 연결하여 Redux의 state에 접근할 수 있게 해주는 메서드이다.
// Redux Hooks 메서드는 'redux'가 아니라 'react-redux'에서 불러옵니다.
import { useSelector } from 'react-redux'
const counter = useSelector(state => state)
console.log(counter) // 1
최신 React 에서는 Context API 를 사용하여 global 하게 상태를 관리할 수 있다고 한다. Redux를 끝내고 다른 상태관리 라이브러리인 Immer나 Mobx도 배워보고 Context API 도 공부해볼 생각이다. 😉