일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- async/await
- 공변성
- webpack
- autosize
- 타입 좁히기
- 반공변성
- ESlint
- React
- tailwind
- dfs
- CORS
- 이분 검색
- CI/CD
- 리터럴 타입
- recoil
- SSR
- Jest
- 태그된 유니온
- Promise
- map
- 호이스팅
- 투포인터
- TS
- useAppDispatch
- app router
- RTK Query
- Cypress
- 인터섹션
- 무한 스크롤
- 결정 알고리즘
Archives
- Today
- Total
짧은코딩
redux-thunk 본문
반응형
간단한 것은 thunk로 구현할 수 있지만 복잡한 것은 saga로 구현하는 것이 좋다.
thunkMiddleware
// thunkMiddleware는 아래 코드가 끝이라서 불러올 가치가 없다
// 기본적으로 action은 객체
const thunkMiddleware = (store) => (next) => (action) => {
//비동기는 함수로 넣어주겠다는 약속
if (typeof action === "function") {
return action(store.dispatch, store.getStats);
}
// 동기
return next(action);
};
thunkMiddleware을 만들고 enhancer에 넣어준다.
동기는 기본적으로 객체로 받고, 비동기는 함수로 받는 것이 약속이다. 따라서 if문을 활용해 action이 함수이면 비동기로 실행하고, 객체이면 동기로 수행한다.
동기(sync)
-로그인 예제
action
// async action creator, 비동기일땐 함수를 리턴해야함
// 동기 action들 간의 순서를 속이는 것이 비동기이다
const logIn = (data) => {
return (dispatch, getState) => {
// 로그인 요청
dispatch(logInRequest(data));
try {
//로그인 성공
setTimeout(() => {
dispatch(
logInSuccess({
userId: 1,
nickname: "zerocho",
})
);
}, 2000);
} catch (e) {
//로그인 실패
dispatch(logInFailure(e));
}
};
};
const logInRequest = (data) => {
return {
type: "LOG_IN_REQUEST",
data,
};
};
const logInSuccess = (data) => {
return {
type: "LOG_IN_SUCCESS",
data,
};
};
const logInFailure = (error) => {
return {
type: "LOG_IN_FAILURE",
error,
};
};
로그인 request를 보내고 성공하냐 실패하냐를 알려주는 예제이다.
동기는 함수로 만들어서 리턴을 해줘야 하기 때문에 "() => {}"의 형태로 리턴을 한다. 리턴하는 함수 안에서는 객체(동기) 형식으로 처리를 할 수 있다.
reducer
const initialState = {
isLoggingIn: false,
data: null,
};
const userReducer = (prevState = initialState, action) => { // 새로운 state 만들어주기
switch (action.type) {
case 'LOG_IN_REQUEST':
return {
...prevState,
data: null,
isLoggingIn: true,
};
case 'LOG_IN_SUCCESS':
return {
...prevState,
data: action.data,
isLoggingIn: false,
};
case 'LOG_IN_FAILURE':
return {
...prevState,
data: null,
isLoggingIn: false,
};
case 'LOG_OUT':
return {
...prevState,
data: null,
};
default:
return prevState;
}
};
module.exports = userReducer;
action이 수정되었으니 reducer도 수정해야 한다.
결과
맨 첫 로깅에 함수가 있어서 동기라는 의미이다.
그리고 2, 3번째 로깅은 객체로 나오기 때문에 비동기이다.
반응형
'인프런, 유데미 > Redux' 카테고리의 다른 글
immer(코드를 줄일 수 있음) (0) | 2022.11.18 |
---|---|
리액트와 리덕스 연결하기, redux devtools (0) | 2022.11.18 |
리덕스 미들웨어 (0) | 2022.09.13 |
리덕스 내부 구조 잡기 (0) | 2022.09.10 |
Redux를 사용하는 이유 및 기본 (0) | 2022.09.06 |
Comments