redux는 동기적으로 작업하기때문에 비동기작업엔 추가적인 미들웨어가 필요하다,
대표적으로 thunk와 saga가 있는데 비교적 난이도가 쉬운 thunk부터 정리해보자
react컴포넌트는 상태에 따른 화면을 정의하는것이 기본 목적이다.
redux만 사용해서는 비즈니스로직이 컴포넌트내에 섞이는등의 단점이 생기기때문에 이를 해결하기위해 미들웨어가 사용된다
redux-thunk를 사용하기위해 redux 디렉터리를 추가한뒤 그 아래 actions, reducer폴더와 store.js를 생성해준다.
//redux/reducer/reducer.js
import { INCREMENT, FETCH_DATA } from "../actions/actions";
const INITIAL_STATE = {
count: 1,
datas: [],
};
export default function counter(state = INITIAL_STATE, action) {
switch (action.type) {
case INCREMENT:
return {
...state,
count: state.count + 1,
};
case FETCH_DATA:
return {
...state,
datas: action.payload,
};
default:
return state;
}
}
// redux/reducer/index.js
import { combineReducers } from "redux";
import counter from "./reducer";
const rootReducer = combineReducers({ counter });
export default rootReducer;
import axios from "axios";
// 액션 추가
export const INCREMENT = "INCREMENT";
export const INCREASE_ASYNC = "INCREASE_ASYNC";
export const FETCH_DATA = "FETCH_DATA";
export const increment = () => ({ type: INCREMENT });
export const incrementAsync = () => ({ type: INCREASE_ASYNC });
export const fetchData = (data) => ({ type: FETCH_DATA, payload: data });
// 액션 함수선언 (실제 페이지들에서 사용될 액션함수)
export const increaseAsync = () => (dispatch) => {
setTimeout(() => dispatch(increment()), 1000);
};
export const fetchDataAsync = () => (dispatch) => {
const fetchFun = async () => {
const res = await axios.get("https://jsonplaceholder.typicode.com/posts");
dispatch(fetchData(res.data));
};
fetchFun();
};
// redux/store.js
import rootReducer from "./reducer/index";
import { createStore, applyMiddleware } from "redux";
import logger from "redux-logger";
import { composeWithDevTools } from "redux-devtools-extension";
import ReduxThunk from "redux-thunk";
export const store = createStore(
rootReducer,
composeWithDevTools(applyMiddleware(ReduxThunk, logger))
);
// index.js
import { Provider } from "react-redux";
import { store } from "./redux/store";
ReactDOM.render(
<Provider store={store}>
<React.StrictMode>
<App />
</React.StrictMode>
</Provider>,
document.getElementById("root")
);