728x90
반응형
이전 포스트에서 Redux-toolkit을 이용하여 상태관리하는 법을 알아보았다.
이번 포스트에서는 createAsyncThunk로 비동기 API를 다루어보자.
1. 이전 포스트에서 함수를 추가한다.
import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'
import axios from 'axios'
// 인터페이스
export interface UserInterface {
number : Number;
}
// state 초기값
const initialState: UserInterface = {
number = 0;
}
// createAsuncThunk function
export const refreshList = createAsyncThunk(
'user/refreshList',
async (body: any, thunkAPI) => {
console.log("body : ", body)
try {
const response = await axios.get('/api/user/', { params: { user__id: "teepo" } })
return (await response.data)
}
catch (Err) {
return thunkAPI.rejectWithValue(Err)
}
}
)
export const userSlice = createSlice({
name: 'user',
initialState,
reducers: {
},
extraReducers: (builder) => {
// pending
builder.addCase(refreshList.pending, (state, action) => {})
// fulfilled
.addCase(refreshList.fulfilled, (state, action) => {})
// rejected
.addCase(refreshList.rejected, (state, action) => {})
}
})
// 액션의 이름을 담아준다 ( CreateSlice 으로 선언한 액션은 생략 가능 !)
export const { } = userSlice.actions;
export default userSlice.reducer;
createAsyncThunk는 3가지의 상태값을 가진다. 각각의 상황에 맞게 로직을 구성해주면 된다.
- pending : 대기
- fulfilled : 이행
- rejected : 거부
컴포넌트에서의 사용은 다음과 같다.
...
import { useDispatch, useSelector } from "react-redux";
import { refreshList } from "../../../../store/reducers/user/userSlice";
...
const userState = useSelector((state: RootState) => state.user)
const userDispatch = useDispatch<AppDispatch>();
...
useEffect(() => {
refreshListHandler(firstRefreshBody(loginData.company_code, postNumber, 0));
try {
userDispatch(refreshList({ aa: "dd" })).then(({ payload }: any) => {
console.log("222", payload)
})
}
catch (err) {
console.log(err)
}
}, []);
action 함수에 원하는 파라미터값을 전달하고 axios를 실행한 뒤 결과값을 다시 반환해주는 시스템이다.
구글링할 때 잘 안나왔는데 typescript에서 AsyncThunkAction 쪽에서 자꾸 then이 없다는 에러가 떴다.
useDispatch<AppDispatch>를 추가하니 에러가 사라졌다.
728x90
반응형
'Front-End > Next.js' 카테고리의 다른 글
Next.js | 세션(express-session)과 토큰(jwt)을 사용한 중복 로그인 방지 ( 기존 사용자 로그아웃 여부 확인) (0) | 2022.03.07 |
---|---|
Next.js | eslint plugin 설정하기 (0) | 2022.02.24 |
Next.js | Redux-toolkit in Next.js( typescript ) | 기본 세팅 (0) | 2022.02.22 |
Next.js | 나만의 React Scheduler Calendar 만들기 ( 캘린더 객체화 ) (0) | 2022.01.06 |
Next.js | Json in Json 상태 관리 (0) | 2022.01.04 |