$ npx create-react-app learn-redux-middleware
$ cd learn-redux-middleware
$ yarn add redux react-redux
src/modules/counter.js
src/modules/index.js
src/index.js에 root reducer 불러와서 이를 통해 새로운 스토어를 만들고 Provider를 사용해서 프로젝트에 적용
components/Counter.js
containers/CounterContainer.js
App.js 렌더링
$ yarn start
$ yarn add redux-logger
$ yarn add redux-devtools-extension
index.js 수정
import { composeWithDevTools } from 'redux-devtools-extension';
const store=createStore(
rootReducer,
composeWithDevTools(applyMiddleware(logger))
};
리덕스에서 비동기 작업을 처리할 때 가장 많이 사용하는 미들웨어.
액션 객체가 아닌 함수를 디스패치할 수 있다.
// 직접 만드는 미들웨어 코드
const thunk = store=>next=>action=>
typeof action === 'function'
? action(store.dispatch, store.getState)
: next(action)
$ yarn add redux-thunk
index.js
import ReduxThunk from 'redux-thunk';
... ReduxThunk,logger));
modules/counter.js
containers/CounterContainer.js
프로미스를 다루는 리덕스 모듈을 다룰 때 고려해야 할 사항
1. 프로미스가 시작, 성공, 실패했을 때 다른 액션을 디스패치해야한다.
2. 각 프로미스마가 thunk 함수를 만들어주어야 한다.
3. 리듀서에서 액션에 따라 로딩중, 결과, 에러 상태를 변경해주어야한다.
modules/posts.js
src/lib.asyncUtils.js 의 함수를 이용하여 기존 posts 모듈 리팩토링
modules/posts.js
리팩토링이 끝났으면 모듈을 루트 리듀서에 등록
components/PostList.js
containers/PostListContainer.js
$ yarn add react-router-dom
index.js
import { BrowserRouter } form 'react-router-dom';
ReactDOM.render(
<BrowserRouter>
...
</BrowserRouter>
components/Post.js
containers/PostContainer.js
pages/PostListPage.js
pages/PostPage.js
App.js 렌더링
PostList 열어서 Link 컴포넌트 사용하기
components/PostList.js
액션을 모니터링하고 있다가 특정 액션이 발생하면 이에 따라 특정 작업을 하는 방식. redux-thunk 다음으로 많이 사용하는 미들웨어.