자바스크립트 애플리케이션을 위한 상태 관리 라이브러리
Flux를 구현해놓은 구현체라고 생각하면 될 것 같다.
// 로깅 미들웨어 생성
// 리덕스를 사용할 때 로그가 찍히게 된다.
const loggerMiddleware = (store:any) => (next:any) => (action:any) => {
console.log("store", store)
console.log("action", action)
next(action)
}
// 미들웨어 등록
const middleWare = applyMiddleware(loggerMiddleware)
// 스토어 생성할때 미들웨어 등록하기
const store = createStore(rootReducer, middleWare)
리덕스를 사용하는 앱에서 비동기 작업을 할 때 많이 사용 하는 방법
thunk란, 일부 지연된 작업을 수행하는 코드 조각을 의미. 지금 일부 논리를 실행하는 대신 나중에 작업을 수행하는데 사용할 수 있는 함수 본문이나 코드를 작성할 수 있다.
비동기 작업을 할땐 주로 서버에 요청을 보내서 데이터를 가져올 때이다
useEffect(() => {
// disptach의 인자로는 액션객체여야 하는데 함수네?
dispatch(fetchPosts())
}, [dispatch])
const fetchPosts = () : any => {
return async function fetchPostThunk(dispatch:any, getState: any) {
const response = await axios.get("https://jsonplaceholder.typicode.com/posts");
dispatch({type:"FETCH_POSTS", payload:response.data})
}
}
// 이렇게만 하면 현재 에러가 난다.
// 원래 action은 객체여야 하는데 현재는 함수를 disptach 하고있어서 나는 에러
// 그래서 함수를 dispatch 할 수 있게 해주는 redux-thunk 미들웨어를 설치
// 미들웨어에 thunk 등록
// thunk를 등록함으로써, 함수를 disptach 할 수 있게 된다.
// redux thunk는 dispatch에 들어온 인자가 액션객체일 경우 리듀서로 보내고
// 액션객체가 아닐경우 dispatch와 getState란 함수로 다시 콜을 한다
const middleWare = applyMiddleware(thunk, loggerMiddleware)
결론 -> Redux Thunk를 사용함으로써 액션 생성자가 그저 하나의 액션 객체를 생성할 뿐 아니라 그 내부안에서 여러가지 작업도 할 수 있게 만들어 준다.