11월 21일 (일) redux (store)

남이섬·2021년 11월 21일
0

store

state가 관리되는 오직 하나뿐인 저장소의 역할을 한다
Redux 앱의 state가 저장되어 있는 공간이이며, createStore 메소드를 활용해 reducer를 연결하는 방법이다
createStore와 더불어 다른 리듀서의 조합을 인자로 넣어서 스토어를 생성할 수 있다
(미들웨어Redux devtools 지원을 위해 두번째 인자에 추가적인 내용이 들어간다)

Store 설정 설명

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;

redux store 패키지 적용

1. rootReducer 를 import 하여 createStore 함수안에 넣어준다

import rootReducer from "./modules"

const store = createStore(rootReducer, [])

2. Provider 컴포넌트를 사용하여 프로젝트에 리덕스를 적용한다

import { Provider } from "react-redux"
import store from './store/store';

ReactDOM.render(
  <Provider store={store}>
    <React.StrictMode>
      <App />
    </React.StrictMode>
  </Provider>,
  document.getElementById("root")
)

3. Redux DevTools(리덕스 개발자 도구) 를 크롬확장 프로그램에 설치한다

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;
profile
즐겁게 살자

0개의 댓글