리덕스는 리액트 생태계에서 사용률이 가장 높은 상태 관리 라이브러리이다.
리덕스를 사용하면 여러 컴포넌트의 상태를 글로벌하게 관리할 수 있으며...
useState 처럼 컴포넌트 내부에서 state 를 관리하는게 아니라, 컴포넌트 바깥에서 사용할 수 있는 매우 편리한 라이브러리이다!
이전에 배운 Context API 또 한, 글로벌 상태 관리를 할 수 있고 상태 관리 로직을 분리할 수 있다.
그러면 둘의 차이점은 무엇일까?
useReducer 를 접해본 적이 있으면, 개념은 비교적으로 쉽다
기본 형태 )
const PLUS_TODO = 'PLUS_TODO'
{
type: PLUS_TODO,
text: 'Build my first Redux app'
}
{
type: "PLUS_TODO",
data: {
id: 0,
text: "리덕스 배우기"
}
}
액션을 만드는 함수
파라미터를 받은 뒤 액션 객체 형태로 주는 역할
export function plusTodo(data) {
return {
type: "PLUS_TODO",
data
};
}
// 화살표 함수로도 만들 수 있다.
export const changeInput = text => ({
type: "CHANGE_INPUT",
text
});
만드는 이유는 나중에 컴포넌트에서 더욱 쉽게 액션을 발생시키기 위함이다. 그리고 함수 앞에 export 키워드를 붙여서, 다른 파일에 불러와 사용한다.
useReducer 와 마찬가지로 reducer 는 변화를 일으키는 함수이다.
두 가지 파라미터를 받아오는데...
function reducer(state, action) {
// 상태 업데이트 로직
return changedState;
}
리듀서는 현재 상태와 전달 받는 액션을 참고해서 새로운 상태를 반환한다.
주로 switch 문을 이용해서 reducer 함수를 작성할 수 있다.
예 )
function count(state, action) {
switch (action.type) {
case 'INCREASE':
return state + 1;
case 'DECREASE':
return state - 1;
default:
return state;
}
}
useReducer 는 보통 default 부분에 error 발생시키도록 처리하는게 일반적이지만, 리덕스의 reducer 는 state 를 그대로 반환해준다.
액션과 리듀서가 함께하는 곳!
일반적인 스토어 형태
import { createStore } from 'redux'
const store = createStore(reducer)
하지만 createStore 는 사용하지 않으므로, redux toolkit 에 있는 configureStore 를 사용하면 된다.
스토어 안에는, 현재의 앱 상태와, 리듀서가 들어가있고, 추가적으로 몇가지 내장 함수들이 있다.
스토어의 내장함수 중 하나!
쉽게 말해서 디스패치는 액션을 발생시키는 일을 한다.
dispatch 라는 함수에 액션을 파라미터로 전달한다.
-> dispatch(action)
호출을 하면, 스토어는 리듀서 함수를 실행시켜 해당 액션을 처리하는 로직이 있다면 액션을 참고해서 새로운 상태를 만든다.
또한 스토어의 내장함수 중 하나
subscribe 함수는 형태의 값을 파라미터로 받아온다.
이 함수에 특정 함수를 전달하면, 액션이 디스패치 될 때마다 전달해준 함수가 호출된다.
리액트에서는 이 함수를 쓸 일을 없다.
대신 react-redux 라는 라이브러리에서 제공하는 connect 함수 또는 useSelector Hook 을 사용해 리덕스 스토어의 상태에 구독한다.
참고 : 벨로퍼트와 함께하는 모던 리액트