리덕스 사가란, 리덕스를 사용할 때 특정 리듀스 액션을 관찰하고 있다가, 그 액션이 실행 되면서 동시에 다른 행동을 취할 수 있게 해주는 함수 입니다.
보통 백엔드 통신을 할 때 많이 사용합니다.
리덕스 사가 이펙트함수란,
등의 이펙트 함수가 있다. 이러한 이펙트 함수로 사용자들이 편리하게 함수를 구현할 수 있다.
Genragtor Function 이란,
function* FunctionName() {}
이런식으로 쓰이게 되는데, 비교적 쉽게 설명하면, yield
가 나오기 전 까지 실행하다가 yield에 해당하는 값을 return하고, (함수면 호출하고) next()
을 기다리는 함수이다.
Redux Saga Effect 들은 이 Generator 함수를 사용해서 이루어진다.
const reducers = combineReducers({
dark: darkSlice.reducer,
user: userSlice.reducer,
});
const sagaMiddleware = createSagaMiddleware();
const createStore = () => {
const store = configureStore({
reducer: reducers,
middleware: [...getDefaultMiddleware(), sagaMiddleware],
devTools: process.env.NODE_ENV !== "production",
});
sagaMiddleware.run(rootSaga);
return store;
};
export type RootState = ReturnType<typeof reducers>;
export default createStore;
function loginUserAPI(data: { email: string; password: string }) {
return axios.post("http://", data);
}
function* loginUser(
action: PayloadAction<{ email: string; password: string }>
) {
try {
const result = yield call(loginUserAPI, action.payload);
yield delay(1000);
yield put(loginSuccessAction(result.data[0]));
} catch (err) {
console.error(err);
yield put({
type: loginErrorACtion.type,
payload: {
error: "로그인 에러",
},
});
}
}
function* watchLoginUser() {
yield takeLatest(loginAction, loginUser);
}
export default function* userSaga(): Generator<
AllEffect<ForkEffect<void>>,
void,
unknown
> {
yield all([fork(watchLoginUser)]);
}
Redux Saga와 기본 Redux와 함께 쓰는 형태는 거의 같다. fork
를 사용할 때, redux-toolkit에서 액션 타입 명을 따로 지정해주지 않기 때문에 무엇을 써야할지 감이 안잡힐 수가 있기 때문에 loginErrorAction.type
을 사용해줘야 한다. 이렇게 type명을 사용하지 않고 액션 자체를 쓰기 위해서는 fork(loginSuccessAction)
을 사용하면 된다.
즉, 그냥 dispatch()
똑같다...
/* 리덕스 */
dispatch({
type: action.type,
payload: data
})
/* 리덕스 툴킷 */
dispatch(action(data))