state가 관리되는 오직 하나뿐인 저장소의 역할을 한다
Redux 앱의 state가 저장되어 있는 공간이이며, createStore 메소드를 활용해 reducer를 연결하는 방법이다
createStore와 더불어 다른 리듀서의 조합을 인자로 넣어서 스토어를 생성할 수 있다
(미들웨어
와 Redux devtools
지원을 위해 두번째 인자에 추가적인 내용이 들어간다)
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__
와 compose
리덕스 개발자도구와 미들웨어를 사용하기 위해서 window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__
를 사용한다
(크롬 확장 프로그램에 작성되어있는 자바스크립트 함수)
만약에 리덕스 개발자도구가 설치되어있지 않다면 일반 compose
를 사용
compose가 하는 일은 깊이 중첩된 함수 변환을 길게 늘어진 코드 없이 작성하게 해주는 것 뿐 이다
enhancer란
enhancer란 말 그대로 redux의 기능을 도와주는 미들웨어나 데브 툴즈와 같은 것들을 말한다
applyMiddleware란
// 일반적으로 sotre를 생성하는 방법 const sotre = createStore(reducer); // applyMiddleware를 활용하여 미들웨어를 거쳐가도록 하는 store 생성법 const store = createStore(RootReducer, applyMiddleware(promiseMiddleware, ReduxThunk))
redux-thunk, redux-promise를 미들웨어로 사용
미들웨어란, 액션과 리듀서 사이에 존재한다, 특정 액션을 가하고 리듀서가 처리하기 전에 작업을 처리한다일반적으로 React에서 redux를 사용한다고 하면 다음과 같이 4개를 사용한다
redux-thunk나 promise는 미들웨어다
thunk 대신 redux-saga를 쓰는 경우도 있지만 우선은 간단하게 thunk와 promise를 사용하자
redux react-redux redux-thunk : dispatch에게 함수 형식을 대처하게 한다 redux-promise : dispatch에게 프로미스 형식을 대처하게 한다
일반적인 redux에서는 객체 형태만을 받아들이지만 프로미스와 함수 형식을 대처할 수 있도록 미들웨어로 처리를 해서 다음과 같이 store를 만들어 준다
compose를 사용해 enhancer를 만든다
Next에서 사용한 코드라서 withRedux 같은 게 붙긴 했지만,
기본적으로 compose는 순차적으로 함수를 적용해나가는 gulp의 pipe 같은 역할을 한다import { compose, createStore, applyMiddleware } from "redux"; import rootReducer from '../reducers/index'; import thunk from "redux-thunk"; const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({}) : compose; const store = createStore(rootReducer, composeEnhancers(applyMiddleware(thunk))); export default store;
import rootReducer from "./modules"
const store = createStore(rootReducer, [])
import { Provider } from "react-redux"
import store from './store/store';
ReactDOM.render(
<Provider store={store}>
<React.StrictMode>
<App />
</React.StrictMode>
</Provider>,
document.getElementById("root")
)
yarn add redux-devtools-extension npm i redux-devtools-extension
import { composeWithDevTools } from "redux-devtools-extension"
const store = createStore(rootReducer, composeWithDevTools())
Redux DevTools(리덕스 개발자 도구) 를 크롬확장 프로그램에 받아서 사용
window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION()
redux DevTools 관련 (2번 방법 사용법이 나와있다)
1 은 실패 .. 왜 안되는 건지 모르겠다
imaport { createStore } from "redux" const store=createStore(rootReducer, window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION() export default store;
2 추천
import { compose, createStore, applyMiddleware } from "redux"; import rootReducer from '../reducers/index'; import thunk from "redux-thunk"; const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({}) : compose; const store = createStore(rootReducer, composeEnhancers(applyMiddleware(thunk))); // console.log('store', store) export default store;