Redux는 자바스크립트 앱을 위한 예측 가능한 상태 컨테이너다.
Redux는 여러 컴포넌트에서 Globally 공유하는 데이터를 관리하기위해 사용한다.
const redux = require("redux");
console.log(redux);
위 코드를 통해 redux
오브젝트의 API를 확인해보면 다음과 같다.
이렇게 5개 밖에 없으니 우선 알아만 두고
Redux 공식 API 레퍼런스 로 필요할때 찾아서 공부하자.
function
으로 정의하여 사용하기도 한다.state
와 action
을 인자로 받는다.object 타입
redux.createStore(reducer)
메소드를 통해 생성된다.
store 메소드 정리
store.getState()
store.dispatch(action)
store.subscribe(listener)
store.replaceReducer(nextReducer)
간단하게 과일바구니 state를 redux로 관리하는 시뮬레이션을 해보겠다.
const redux = require("redux");
// actions
const addApple = () => {
return {
type: "ADD_APPLE"
}
}
// reducers
const initState = {apple: 3};
const reducer = (state = initState, action) => {
switch(action.type) {
case 'ADD_APPLE':
return {
...state,
apple: state.apple + 1
}
default:
return state;
}
}
// store
const store = redux.createStore(reducer);
// subscribe - view - dispatch
console.log(store.getState());
store.dispatch(addApple());
console.log(store.getState());
store.dispatch(addApple());
console.log(store.getState());
dispatch()
를 할 때 마다,getState()
를 불러서 console.log로 state를 확인했다.subscribe()
를 이용해서 자동화가 가능하다.store의 subscribe(listener)
메소드는 state에 변화가 생길때마다 콜백함수(listener)를 실행시켜준다. (useEffect랑 비슷한듯)
store.subscribe(() => {
console.log('state : ', store.getState());
})
store.dispatch(addApple());
store.dispatch(addApple());
store.dispatch(addApple());
store.dispatch(addApple());
결과
(listener가 action이 끝난 '후'에 작동하는 디테일도 확인할 수 있다!)
redux.applyMiddleware() 메소드를 통해서 미들웨어를 생성할 수 있고,
redux.createStore() 의 두번째 인자로 middleware를 넣는다.
redux-logger 라는 redux middleware 모듈을 사용해보자.
npm i redux-logger
subscribe한 것을 주석처리하고 대신 logger middleware를 적용시키면
const reduxLogger = require('redux-logger');
logger = reduxLogger.createLogger();
// ...
const store = redux.createStore(
reducer,
redux.applyMiddleware(logger)
);
결과
state가 변할 때 마다 다음의 로그가 찍힌다.
store에 두 개 이상의 Reducer를 함께 넘기기 위해 사용한다.
// reducer1, reducer2
// ...
const rootReducer = redux.combineReducers({
reducer1: reducer1,
reducer2: reducer2
})
const store = redux.createStore(rootReducer);